【发布时间】:2019-11-11 04:59:36
【问题描述】:
在 StackOverflow 上搜索了各种类似的问题后,我确定大多数遭受此问题的人都没有正确扫描他们的控制器所在的模块。一些解决方案要求将要扫描的文件组合到与应用程序相同的模块中(有效),但我不想移动我的任何 .java 文件。相反,我想让@ComponentScan 工作。
我有以下项目结构
Project
|
settings.gradle
build.gradle
module1
|
src/main/java/com.test.application
| |
| Application.java
| SwaggerConfig.java
build.gradle
module2
|
src/main/java/com.test.service
| |
| Service.java
| Controller.java
build.gradle
Application.java
@SpringBootApplication
@ComponentScan("com.test")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
请注意,我在组件扫描中扫描com.test。我在 @ComponentScan documentation(或 StackOverflow 上)中找不到任何表明我错误地使用了 @ComponentScan 的内容。
Controller.java
@RestController
@RequestMapping("/test")
public class GearParsingController {
private SomeService someService;
@Autowired
public SomeController(SomeService someService) {
this.someService = someService;
}
@GetMapping("/path")
public ResponseEntity<String> getSomeService() {
return new ResponseEntity<String>("Default message", HttpStatus.OK);
}
}
项目 build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.6.RELEASE")
}
}
subprojects {
repositories {
mavenCentral()
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
}
module1 build.gradle
dependencies {
implementation project(':module2')
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.1.6.RELEASE'
}
module2 build.gradle
dependencies {
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.1.6.RELEASE'
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0-RC2'
}
当我尝试在localhost:8080/test/path 访问我的端点时,我遇到了:
{
"timestamp": "2019-06-29T19:19:52.275+0000",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/test/path"
}
在调试模式下启动程序时,我得到以下输出:
2019-06-29 13:58:58.345 INFO 8272 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2019-06-29 13:58:58.387 INFO 8272 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2019-06-29 13:58:58.387 INFO 8272 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.21]
2019-06-29 13:58:58.522 INFO 8272 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-06-29 13:58:58.522 DEBUG 8272 --- [ main] o.s.web.context.ContextLoader : Published root WebApplicationContext as ServletContext attribute with name [org.springframework.web.context.WebApplicationContext.ROOT]
2019-06-29 13:58:58.522 INFO 8272 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1786 ms
2019-06-29 13:58:58.544 DEBUG 8272 --- [ main] o.s.b.w.s.ServletContextInitializerBeans : Mapping filters: characterEncodingFilter urls=[/*], hiddenHttpMethodFilter urls=[/*], formContentFilter urls=[/*], requestContextFilter urls=[/*]
2019-06-29 13:58:58.545 DEBUG 8272 --- [ main] o.s.b.w.s.ServletContextInitializerBeans : Mapping servlets: dispatcherServlet urls=[/]
2019-06-29 13:58:58.583 DEBUG 8272 --- [ main] o.s.b.w.s.f.OrderedRequestContextFilter : Filter 'requestContextFilter' configured for use
2019-06-29 13:58:58.583 DEBUG 8272 --- [ main] .s.b.w.s.f.OrderedHiddenHttpMethodFilter : Filter 'hiddenHttpMethodFilter' configured for use
2019-06-29 13:58:58.583 DEBUG 8272 --- [ main] s.b.w.s.f.OrderedCharacterEncodingFilter : Filter 'characterEncodingFilter' configured for use
2019-06-29 13:58:58.584 DEBUG 8272 --- [ main] o.s.b.w.s.f.OrderedFormContentFilter : Filter 'formContentFilter' configured for use
2019-06-29 13:58:58.896 DEBUG 8272 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : 5 mappings in 'requestMappingHandlerMapping'
2019-06-29 13:58:58.990 INFO 8272 --- [ main] pertySourcedRequestMappingHandlerMapping : Mapped URL path [/v2/api-docs] onto method [public org.springframework.http.ResponseEntity<springfox.documentation.spring.web.json.Json> springfox.documentation.swagger2.web.Swagger2Controller.getDocumentation(java.lang.String,javax.servlet.http.HttpServletRequest)]
2019-06-29 13:58:59.045 DEBUG 8272 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Patterns [/**/favicon.ico] in 'faviconHandlerMapping'
2019-06-29 13:58:59.128 INFO 8272 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2019-06-29 13:58:59.146 DEBUG 8272 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : ControllerAdvice beans: 0 @ModelAttribute, 0 @InitBinder, 1 RequestBodyAdvice, 1 ResponseBodyAdvice
2019-06-29 13:58:59.257 DEBUG 8272 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Patterns [/webjars/**, /**] in 'resourceHandlerMapping'
2019-06-29 13:58:59.263 DEBUG 8272 --- [ main] .m.m.a.ExceptionHandlerExceptionResolver : ControllerAdvice beans: 0 @ExceptionHandler, 1 ResponseBodyAdvice
2019-06-29 13:58:59.442 INFO 8272 --- [ main] d.s.w.p.DocumentationPluginsBootstrapper : Context refreshed
2019-06-29 13:58:59.481 INFO 8272 --- [ main] d.s.w.p.DocumentationPluginsBootstrapper : Found 1 custom documentation plugin(s)
2019-06-29 13:58:59.519 INFO 8272 --- [ main] s.d.s.w.s.ApiListingReferenceScanner : Scanning for api listing references
所以,我的问题是:为什么 ComponentScan 没有检测到我的 REST 控制器?
【问题讨论】:
-
这些单独的“文件夹”看起来像单独的模块/jar,并且您不会显示从启动器到实现的依赖关系。 (请注意,将
org.springframework.web上的日志记录设置为调试,您将在启动时获得每个 Web 映射的列表。) -
@chrylis folder1 的 build.gradle 依赖于 folder2 模块。我已经更新了我的问题,以使这一点更清楚。如果这不是你的意思,请告诉我。
-
是的,这就是我的意思。打开您的调试日志(您可以通过在调试模式下启动应用程序来获得,如
--debug或您的 IDE 设置)以查看有关 MVC 注册的信息。 -
@buratino 只是为了确保检查 com/test/application 被声明为包而不是名称为“com.test.application”的单个包
-
@chrylis 我已将输出添加到我的帖子中。
标签: java spring spring-boot gradle