2017-02-15 55 views
0

我有2个项目,主要的春季启动项目和第二个春季项目,其中包含@Contollers,@Services等。@ComponentScan从2包

我尝试在主项目中使用这些服务。我看到了类似的问题,如hereherehere和许多人一样,但它并不适合我

1)的工作,如果我刚才

@SpringBootApplication 
public class App { ... } 

那么它不会因为编译无法找到服务第二个项目

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

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

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

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); 

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

我感谢任何帮助!谢谢!

+0

我认为在两个不同的SpringBoot应用程序上下文之间共享代码的想法违背了有两个应用程序的整个想法。我建议使用共享代码创建第三个SpringBoot项目,并通过RestAPI公开功能。 – Fernando

+0

第二个应用程序是普通的spring mvc应用程序,在第一个spring引导应用程序中需要大约30%的类。实施休息服务是我的第一个想法,但它不是一种选择,因为那么整个工作将在一台服务器上执行,其中位于第二个应用程序的位置。那个服务器已经超载 – Slava

+0

当然我可以复制所有的代码,但是比改变的情况下,我将不得不改变几个地方而不是一个。我认为,必须有某种方式来重用另一个模块的服务,这是作为依赖关系包含的 – Slava

回答

0

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

@SpringBootApplication 
public class App { ... } 

比你说它甚至没有编译。

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

2)如果添加@ComponentScan 1的默认组件扫描)不这样做,而不是扫描只是做开始 'secondPackage'

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

比你写

映射呢根本不工作

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

要解决这一点,你可以尝试

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

这可能会给你你从2)

预期的结果如果母鹿不行,我建议建立在引用的项目的java配置类,只配置,你需要在你的应用程序。

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

如果您的应用程序仍然没有正确配置服务和映射,那么您可以微调引用的配置,直到获得完全所需的弹簧环境。

+0

谢谢@Stefan,我尝试了@ComponentScan({“first”,“second”}),在这种情况下,应用程序已编译,我可以从主应用程序类调用控制器,但映射仍然中断。这里奇怪的是,在1-s应用程序中大约有3个映射的url,在2-d模块中大约有4个路径,它们都被破坏了。我会明白,如果其中一个将工作。这意味着,某些配置会重写另一个配置,但在这种情况下它们都被破坏了。你能给我一个导入配置的例子吗?假设我需要从基本应用程序控制器中的第二个项目自动调用一个服务 – Slava

+0

这里的问题是,ComponentScan中断映射,没有ComponentScan,应用程序将看不到另一个包和配置类。所以我应该尝试像@Import({AppConfigWeb.class}) @ImportResource(“classpath:/config/spring.xml”)? – Slava