Spring Boot Controller没有映射

时间:2017-07-19 07:35:57

标签: java 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.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@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)

11 个答案:

答案 0 :(得分:46)

我也有类似的问题,并且能够通过更正this之后的源包结构来解决问题

组件扫描不扫描您的Controller类。您的Controller类必须嵌套在包层次结构中,并且必须嵌套到具有main()方法的主SpringApplication类中,然后才会扫描它,并且您还应该在Spring Boot开始时看到控制台输出中列出的RequestMappings。

在Spring Boot 1.5.8.RELEASE

上测试

但如果您更喜欢使用自己的包装结构,可以随时使用@ComponentScan注释来定义要扫描的basePackages

答案 1 :(得分:9)

由于DemoApplication.classHelloController.class在同一个程序包中
在其他类之上的根包中找到您的主应用程序类
看看Spring Boot文档Locating the Main Application Class

  

使用根软件包还可以将组件扫描仅应用于您的   项目。

例如,您的情况如下所示:

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

答案 2 :(得分:2)

在我的情况下,它缺少pom.xml的依赖,否则所有编译都很好。来自Spring日志的404和丢失的映射信息是唯一的提示。

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

答案 3 :(得分:2)

我在遇到类似问题时也遇到了麻烦,并按照以下说明使用正确的软件包结构解决了该问题。更正后,它可以正常工作。 例如

  • Spring应用程序主类位于com.example包中
  • 控制器类位于com.example.controller包中

答案 4 :(得分:2)

在@SpringBootApplication上面的主类中添加@ComponentScan(com.webservice)将解决您的问题。请参考下面的代码

package com.webservice.demo;

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

@ComponentScan(com.webservice)
@SpringBootApplication
public class DemoApplication {

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

答案 5 :(得分:1)

就我而言,我使用 @Controller 而不是 @RestController@RequestMapping

答案 6 :(得分:0)

这取决于几个属性:

    应用程序属性中的
  • server.contextPath属性。如果它被设置为任何值,那么您需要将其附加到您的请求URL中。如果没有此类属性,请在application.properties server.contextPath=/
  • 中添加此行 method中的
  • @RequestMapping属性,似乎没有任何值,因此,根据documentation,它应映射到所有方法。但是,如果您希望它听取任何特定方法,那么您可以将其设置为让我们说method = HttpMethod.GET

答案 7 :(得分:0)

我找到了答案。这是因为在较新版本的Spring Framework中更新的安全配置。所以我只是将我的版本从1.5.4更改为1.3.2

答案 8 :(得分:0)

当我创建新项目时,依赖项检查了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>

一切都开始起作用。

此后,我使用仅依赖项Web >> Web签入向导创建了新项目,并且从一开始就得到了想要的东西。

就我而言,我不必使用 server.contextPath 做任何事情,也不必使用方法

答案 9 :(得分:0)

在我看来,当我们将组件扫描留给Spring时,就会出现这种可见性问题,它具有使用标准约定查找类的特殊方式。 在这种情况下,由于Starter类(DemoApplication)位于com.webservice.demo包中,因此将Controller置于较低的位置将有助于Spring使用默认的组件扫描机制查找这些类。将HelloController放在com.webservice.demo.controller下应该可以解决此问题。

答案 10 :(得分:0)

在我的情况下,我使用了错误的端口来进行测试请求-Tomcat是从暴露了多个端口(包括一个用于监视/ actuator的端口)启动的。