Spring Контроллер загрузки не отображается

Я использовал STS, и теперь я использую IntelliJ Ultimate Edition, но я все равно получаю тот же результат. Мой контроллер не получает сопоставление, таким образом отображая ошибку 404. Я совершенно не знаком с Spring Framework.

DemoApplication.java

package com.webservice.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

HelloController.java

package com.webservice.demo;


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String sayHello(){
        return "Hey";
    }

}

Консольный выход

com.webservice.demo.DemoApplication      : Starting DemoApplication on XFT000159365001 with PID 11708 (started by Mayank Khursija in C:\Users\Mayank Khursija\IdeaProjects\demo)
    2017-07-19 12:59:46.150  INFO 11708 --- [           main] com.webservice.demo.DemoApplication      : No active profile set, falling back to default profiles: default
    2017-07-19 12:59:46.218  INFO 11708 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot[email protected]238e3f: startup date [Wed Jul 19 12:59:46 IST 2017]; root of context hierarchy
    2017-07-19 12:59:47.821  INFO 11708 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8211 (http)
    2017-07-19 12:59:47.832  INFO 11708 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
    2017-07-19 12:59:47.832  INFO 11708 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.15
    2017-07-19 12:59:47.944  INFO 11708 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
    2017-07-19 12:59:47.944  INFO 11708 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1728 ms
    2017-07-19 12:59:47.987  INFO 11708 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
    2017-07-19 12:59:48.510  INFO 11708 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
    2017-07-19 12:59:48.519  INFO 11708 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 0
    2017-07-19 12:59:48.634  INFO 11708 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8211 (http)
    2017-07-19 12:59:48.638  INFO 11708 --- [           main] com.webservice.demo.DemoApplication      : Started DemoApplication in 2.869 seconds (JVM running for 3.44)

Ответ 1

Я нашел ответ на этот вопрос. Это произошло из-за конфигурации безопасности, которая обновляется в новых версиях Spring Framework. Поэтому я просто изменил свою версию с 1.5.4 до 1.3.2

Ответ 2

У меня тоже была похожая проблема, и я смог наконец решить ее, исправив структуру пакета исходного кода, следуя этой инструкции.

Ваши классы контроллера не сканируются при сканировании компонентов. Ваши классы контроллеров должны быть вложены ниже в иерархии пакетов в основной класс SpringApplication, имеющий метод main(), тогда только он будет сканироваться, и вы также должны увидеть RequestMappings, перечисленные в выводе консоли, когда Spring Boot начинает работу.

Протестировано на Spring Boot 1.5.8. ВЫПУСК

Но если вы предпочитаете использовать собственную структуру упаковки, вы всегда можете использовать аннотацию @ComponentScan для определения ваших basePackages для сканирования.

Ответ 3

Из-за DemoApplication.class и HelloController.class в одном пакете
Найдите ваш основной класс приложения в корневом пакете над другими классами
Ознакомьтесь с документацией по Spring Boot. Определение класса основного приложения.

Использование корневого пакета также позволяет сканировать компоненты только для вашего проекта.

Например, в вашем случае это выглядит так:

com.webservice.demo.DemoApplication
com.webservice.demo.controller.HelloController

Ответ 4

В моем случае отсутствовала зависимость от pom.xml, иначе все компилировалось просто отлично. Информация 404 и отсутствующие сопоставления из журналов Spring были единственными подсказками.

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

Ответ 5

Это зависит от нескольких свойств:

  • server.contextPath свойство в свойствах приложения. Если он установлен на любое значение, вам нужно добавить это в свой URL-адрес запроса. Если такого свойства нет, добавьте эту строку в application.properties server.contextPath=/
  • method в @RequestMapping, похоже, нет никакого значения и, следовательно, согласно документации, он должен отображать ко всем методам. Однако, если вы хотите, чтобы он прослушивал какой-либо конкретный метод, вы можете установить его, чтобы сказать method = HttpMethod.GET

Ответ 6

Когда я создавал новый проект, проверил Dependency Web >> Jersey (JAX-RS) и попал в pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jersey</artifactId>
</dependency>

Все компилировалось, никакого отображения в журнале, такая же ситуация, как у вас.

Итак, я вручную добавил в pox.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

И все начинает работать.

После этого я создал новый проект с Dependency only Web >> Web check in wizard, и я получил то, что хочу с самого начала.

В моем случае мне не пришлось ничего делать с server.contextPath ни одним из методов.

Ответ 7

По моему мнению, эта проблема видимости возникает, когда мы оставляем компонентное сканирование в Spring, который имеет особый способ поиска классов с использованием стандартного соглашения. В этом сценарии, поскольку класс Starter (DemoApplication) находится в пакете com.webservice.demo, размещение контроллера на один уровень ниже поможет Spring найти классы с использованием механизма сканирования компонентов по умолчанию. Помещение HelloController в com.webservice.demo.controller должно решить проблему.