Rest 控制器仅适用于应用程序 class

Rest Controller works just for Application class

我正在尝试使用 rest-api 执行 getmapping 方法,它将 return 作为本地主机上的 JSON:8080。当我从默认应用程序 class 它工作得很好,但是当我将此功能移动到另一个 class 时,什么也没有发生。有人可以帮我解决这个问题吗?

原因1:默认Spring的组件扫描无法找到你的@RestController组件,你可以尝试直接@ComponentScan

原因 2:您需要使用 @RequestMapping/@GetMapping("url") 或两者为您的 @GetMapping 指定端点。

问题是您的包结构阻止了 BookController 组件扫描。

当您在包 com.xenon.myspringbootapp 中定义 @SpringBootApplication 时,该包和嵌套包中的任何内容都可以进行组件扫描,这将从 @(Rest)Controller 中注册一个 bean 并且其他刻板印象。

因为 BookControllerbook 中定义,它在组件扫描包之外,因此不会被您的 @SpringBootApplication 注释扫描组件。

有关 Spring 引导应用程序的包结构的更多最佳实践,请参阅 the reference docs

要解决此问题,有两种选择可以扫描您的 class 组件。

第一个(也是我推荐的方法)只是重组您的包,以便 @SpringBootApplication class 位于您的应用程序包的“基础”。例如,您可以将 book.BookController 移动到 com.xenon.myspringbootapp.book.BookController.

第二个是更改组件扫描配置以包含您的 book 包。您可以在 @SpringBootApplication 注释本身上执行此操作:

@SpringBootApplication(scanBasePackages = {
        "com.xenon.myspringbootapp",
        "book"
})

或者,定义一个不同的 @ComponentScan。请注意,使用 @ComponentScan 注释的配置 class 仍必须对其自身进行组件扫描。

@SpringBootApplication
public class MySpringBootAppApplication {

    @Configuration
    @ComponentScan("book")
    public static class MyBookComponentScanConfiguration {}

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