Spring 导入模块中的引导和控制器

Spring boot and controllers in imported modules

我有一个 Spring 引导应用程序,我想导入一个用 spring 引导编写的依赖项,它定义了一些控制器。

也许这很简单,但我怎样才能让主应用程序能够初始化导入模块中的所有这些控制器?当我尝试访问这些控制器的路径时,我收到一条错误消息,指出缺少给定路径的处理程序方法。我尝试如下:

@SpringBootApplication
@ComponentScan(basePackages = {"com.main.project", "com.imported.dependency"})
public class MyApplication
    implements CommandLineRunner {

    public static void main(final String... args) {
        SpringApplication app = new SpringApplication(MyApplication.class);
        app.setWebEnvironment(true);
        app.run(args);

    }
}

即我尝试使用 @ComponentScan,但没有任何反应。

我也尝试查看控制器是否已加载:

ApplicationContext ctx = SpringApplication.run(FrontendApplication.class, args);

System.out.println("Let's inspect the beans provided by Spring Boot:");

String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for (String beanName : beanNames) {
    System.out.println(beanName);
}

他们不是。我尝试删除 @SpringBootApplication 并使用 @EnableAutoConfiguration@ComponentScan,但这不起作用。

建议?

也许你有冲突:

@SpringBootApplication 和@ComponentScan。

在Spring引导文档中我们可以阅读

The @SpringBootApplication annotation is equivalent to using @Configuration, @EnableAutoConfiguration and @ComponentScan with their default attributes

link:@SpringBootApplication documentation

你能删除你的@SpringBootApplication 并用@Configuration 和@EnableAutoConfiguration 替换它吗?

使用@Configuration 和@EnableAutoConfiguration 注释。

@SpringBootApplication 将自动从 class 路径中的每个 jar 中扫描每个具有子包名称空间的 class。如果您的项目遵循 Spring 推荐的目录结构,那么该注释就是您所需要的。参见:Spring Boot's Documentation on Structuring your code.

尝试以下操作:

  1. 删除这行代码:

    @ComponentScan(basePackages = {"com.main.project", "com.imported.dependency"})
    
  2. 移动MyApplication 使其位于您的根目录中。根目录应遵循此命名约定 com.example.project。因此,您的 spring 引导应用程序主 class 的完全限定路径将是:com.example.project.MyApplication,同时将 exampleproject 替换为您的公司主机名和项目名称.

  3. 将您的控制器放入其中的子包中(即使打包在单独的 jar 中)。所以他们的命名空间应该是这样的:com.example.project.controllers.

  4. 此外,不要忘记将 @Controller@RestController 注释添加到您的控制器 classes.

希望对您有所帮助!

在主线程上的讨论之后,我尝试设置一个像您的小项目并将其放在 github 上,我看不出有任何问题。

看看https://github.com/e-ivaldi/mat_boy_test

这是来自日志 2015-10-24 17:22:02.900 INFO 31901 --- [main] s.w.s.m.m.a.RequestMappingHandlerMapping:映射“{[/**]}”到 public java.lang.String com.somethingelse.controllers.SimpleController.xxx()