3

我有2个项目,主spring boot项目和第二个spring项目,其中包含@Contollers、@Services等。

我尝试在主项目中使用其中的一些服务。我看到了类似的问题,例如这里这里这里和许多其他问题,但它对我不起作用

1)如果我刚刚

@SpringBootApplication
public class App { ... }

然后它无法编译,因为无法从第二个项目中找到服务

2)如果我尝试扫描第二个包

@SpringBootApplication
@ComponentScan("secondPackage")
public class App {}

然后应用程序启动没有错误,但控制器映射根本不起作用。无法解决两个项目的映射。

3)然后我尝试从第二个包中排除控制器,因为我不需要它们,映射仍然不起作用

@ComponentScan(basePackages="secondPackage", excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)})

4)然后我尝试扫描特定服务,但在这种情况下,其他资源不可用,我必须包含很多路径

@ComponentScan({"first package", "second package"})

5)最后我尝试制作2个配置文件

@Configuration
@ComponentScan(basePackages = {"mainPackage"})
public class MainConfiguration {

}

@Configuration
@ComponentScan(basePackages="secondPackage", 
        excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)})
public class SecondConfiguration {

}

但我没有找到示例,如何在 SpringApplication.run(App.class, args); 之前准备上下文 然后让应用程序在我的上下文中运行。喜欢

ApplicationContext myContext = new AnnotationConfigApplicationContext(OrderStatusConfiguration.class, ShopRuServicesConfiguration.class);
SpringApplication.run(App.class, myContext, args);

所以请给我一个建议,为什么映射不起作用或者我应该如何从第二个项目中获得正确的自动装配服务!

我很感激任何帮助!谢谢!

4

1 回答 1

1

1) 空注释触发默认组件扫描。这是从注释类的包开始的

@SpringBootApplication
public class App { ... }

比你说的它甚至不编译。

这意味着,您的 spring 配置按名称引用了一些不在类路径中的类。

2) 如果您添加@ComponentScan,则 1) 的默认组件扫描未完成,而是仅从“secondPackage”开始进行扫描

@SpringBootApplication
@ComponentScan("secondPackage")
public class App {}

比你写的

映射根本不起作用

这可能意味着控制器根本不包含在弹簧配置中。

要解决此问题,您可以尝试

@SpringBootApplication
@ComponentScan({"package of App","secondPackage"})
public class App {}

这可能会给您带来您期望的结果 2)

如果这不起作用,我建议在引用的项目中创建 java 配置类,只配置你在应用程序中需要的东西。

使用 @Import 导入这些配置。通过这种方式,您可以引用应用程序中的配置类,并验证您的类路径是否已正确配置。

如果你的应用仍然没有正确配置服务和映射,你可以微调引用的配置,直到你得到你需要的确切的 spring 上下文。

于 2017-02-18T11:06:20.460 回答