我使用过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)
答案 0 :(得分:46)
我也有类似的问题,并且能够通过更正this之后的源包结构来解决问题
组件扫描不扫描您的Controller类。您的Controller类必须嵌套在包层次结构中,并且必须嵌套到具有main()方法的主SpringApplication类中,然后才会扫描它,并且您还应该在Spring Boot开始时看到控制台输出中列出的RequestMappings。
在Spring Boot 1.5.8.RELEASE
上测试但如果您更喜欢使用自己的包装结构,可以随时使用@ComponentScan
注释来定义要扫描的basePackages
。
答案 1 :(得分:9)
由于DemoApplication.class
和HelloController.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)
我在遇到类似问题时也遇到了麻烦,并按照以下说明使用正确的软件包结构解决了该问题。更正后,它可以正常工作。 例如
答案 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的端口)启动的。