java - SpringBoot无法扫描Controller并获取URL映射
问题描述
我刚刚编写了一个 Springboot 应用程序作为来自 spring.io 的测试 Web 服务器。它最初打包在“jar”中,将其更改为“war”文件。并获取应用程序类代码如下:
package com.ronzhong;
import org.springframework.boot.Banner.Mode;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.web.context.WebApplicationContext;
@SpringBootApplication(scanBasePackages={"com.ronzhong.libraryManagement"})
public class LibraryManagementApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
application.application().setBannerMode(Mode.OFF);
return application.sources(SpringApplicationBuilder.class);
}
protected WebApplicationContext run(SpringApplication application) {
return (WebApplicationContext) application.run();
}
// public static void main(String[] args) {
// SpringApplication.run(LibraryManagementApplication.class, args);
//}
}
控制器是:
package com.ronzhong.libraryManagement;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.*;
//@CrossOrigin(origins = "http://localhost:4200", maxAge = 3600)
@RestController
@RequestMapping("/api")
public class CounterController {
@Autowired
private BookService bookService;
@PostMapping
public boolean add(@RequestBody Book book){
return bookService.add(book);
}
@RequestMapping(value = "/books", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public Book[] get(){
return bookService.getBooks();
}
@RequestMapping(value = "{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public Book findOne(@PathVariable("id") int id){
return bookService.findById(id);
}
}
我还检查了项目方面的“动态 Web 模块”。最后,我在使用生成的这个war文件启动tomcat服务器时得到了这些日志。
INFO: 2 Spring WebApplicationInitializers detected on classpath
2018-11-28 10:43:31.925 INFO 14888 --- [ main] c.ronzhong.LibraryManagementApplication : Starting LibraryManagementApplication on ronzhongmachine with PID 14888 (C:\Users\ronzhong\workspace_testserver\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\library-Management\WEB-INF\classes started by ronzhong in C:\tools_installers\eclipse-jee-2018-09-win32-x86_64\eclipse)
2018-11-28 10:43:32.002 INFO 14888 --- [ main] c.ronzhong.LibraryManagementApplication : No active profile set, falling back to default profiles: default
2018-11-28 10:43:33.910 INFO 14888 --- [ main] o.a.c.c.C.[.[.[/library-Management] : Initializing Spring embedded WebApplicationContext
2018-11-28 10:43:33.911 INFO 14888 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1604 ms
2018-11-28 10:43:34.362 INFO 14888 --- [ main] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'errorPageFilter' to: [/*]
2018-11-28 10:43:34.704 INFO 14888 --- [ main] c.ronzhong.LibraryManagementApplication : Started LibraryManagementApplication in 5.958 seconds (JVM running for 36.407)
2018-11-28 10:43:34.955 INFO 14888 --- [ main] org.apache.coyote.ajp.AjpNioProtocol : Starting ProtocolHandler ["ajp-nio-8009"]
2018-11-28 10:43:34.968 INFO 14888 --- [ main] org.apache.catalina.startup.Catalina : Server startup in 28177 ms
日志中没有映射信息。如果我用http://localhost:8080/api/books请求,它会得到 404 错误。但是日志没有任何变化。所以我搜索了可能的原因,并暂时排除了这些原因:
- springboot应用不扫描控制器所在的包?
我将 springboot 应用程序类移到了上层包中,并且还指定了它应该扫描什么样的包。当你看到时,它不起作用。 - 注释问题?
有人说我们应该使用@RestController 注解而不是@Controller,最好添加@ResponseBody,而我这样做了。它也不起作用。 - 部署问题?
不知道,我确实改了这个项目的构建路径,正常生成了jar文件和war文件,但是webapp文件夹是空的,因为我没有静态资源,我觉得没问题吧?
任何人都可以帮助我吗?非常感谢您的回答,在此先感谢。
解决方案
从日志中,我可以看到您的 war 文件名为 library-Management,这意味着它已在此文件夹下部署,如日志所述。所以你应该检查http://localhost:8080/library-Management/api/books。
您从 Tomcat 获得 404,它根本不会影响您的应用程序,这就是您看不到任何日志的原因。
推荐阅读
- javascript - 内部 html 不使用我的链接样式表
- utf-8 - gnuplot中的希腊字母pi未呈现
- vue.js - 如何从 nuxt.js 页头的 node_modules 文件夹中引用 js 文件
- java - 如何使用 Apache HttpClient 发布非 JSON 请求?
- git - Jenkins git maven 发布 - git push 失败/更新被拒绝
- java - 解释以下代码片段的 scp 和堆对象创建
- azure-cosmosdb - 可以在提供的数据库级别吞吐量上更改特定的集合 RU 吗?
- flutter - 如何在 video_player 上无延迟地连续播放视频?
- python - 是否存在具有大量类的多类分类架构?
- python - 我想在turtlegraphics的墙上有一个弹跳球,但他们停下来,他们徘徊并发送错误