Spring Boot:来自库项目的自动装配 bean
Posted
技术标签:
【中文标题】Spring Boot:来自库项目的自动装配 bean【英文标题】:Spring Boot: autowire beans from library project 【发布时间】:2017-06-08 12:35:50 【问题描述】:我正在努力从使用 gradle 导入的自定义库中自动装配 bean。 在阅读了几个类似的主题后,我仍然无法找到解决方案。
我有一个 Spring Boot 项目,它依赖于另一个项目(我的自定义库,包含组件、存储库等......)。这个库是一个 Spring 不可运行的 jar,主要由域实体和存储库组成。它没有可运行的 Application.class 和任何属性...
当我启动应用程序时,我可以看到我的“CustomUserService”bean(来自库)正在尝试初始化,但其中自动装配的 bean 无法加载(接口 UserRepository)...
错误:
构造函数的参数0 com.myProject.customLibrary.configuration.CustomUserDetailsService 需要一个 bean 类型 'com.myProject.customLibrary.configuration.UserRepository' 不能 找到了。
我什至尝试设置“Order”,显式加载它(使用scanBasePackageClasses
),使用包和标记类进行扫描,添加额外的EnableJPARepository
注释,但没有任何效果...
代码示例(为简单起见更改了包名称)
package runnableProject.application;
import runnableProject.application.configuration.ServerConfigurationReference.class
import com.myProject.customLibrary.SharedReference.class
//@SpringBootApplication(scanBasePackages = "com.myProject.customLibrary", "runnableProject.configuration")
//@EnableJpaRepositories("com.myProject.customLibrary")
@SpringBootApplication(scanBasePackageClasses = SharedReference.class, ServerConfigurationReference.class)
public class MyApplication
public static void main(String[] args)
SpringApplication.run(MyApplication.class, args);
库中的类:
package com.myProject.customLibrary.configuration;
import com.myProject.customLibrary.configuration.UserRepository.class;
@Service
public class CustomUserDetailsService implements UserDetailsService
private UserRepository userRepository;
@Autowired
public CustomUserDetailsService(UserRepository userRepository)
this.userRepository = userRepository;
...
package myProject.customLibrary.configuration;
@Repository
public interface UserRepository extends CustomRepository<User>
User findByLoginAndStatus(String var1, Status var2);
...
【问题讨论】:
【参考方案1】:刚刚找到解决方案。 我没有定义要从单独的库中扫描的基本包,而是在这个库中创建了带有大量注释的配置类,并将其导入到我的主 MyApplication.class:
package runnableProject.application;
import com.myProject.customLibrary.configuration.SharedConfigurationReference.class
@SpringBootApplication
@Import(SharedConfigurationReference.class)
public class MyApplication
public static void main(String[] args)
SpringApplication.run(MyApplication.class, args);
package com.myProject.customLibrary.configuration;
@Configuration
@ComponentScan("com.myProject.customLibrary.configuration")
@EnableJpaRepositories("com.myProject.customLibrary.configuration.repository")
@EntityScan("com.myProject.customLibrary.configuration.domain")
public class SharedConfigurationReference
【讨论】:
是的。系统将允许我在 2 天内完成。 2 天过去了。你应得的分数。在搜索了无数网站后,您的回答解决了我的问题。 我认为您应该在导入结束时删除“.class”部分 非常简单明了的答案 +1 但是,如果您想避免导入配置类。您可以在库的“resources”文件夹中创建一个名为“META-INF”的文件夹,并添加一个名为“spring.factories”的文件,其内容为org.springframework.boot.autoconfigure.EnableAutoConfiguration=<fully_qualified_name_of_configuration_file>
。这将自动配置您的库。【参考方案2】:
接受的答案太麻烦了。您需要做的是在您的库 jar 中实现您自己的自定义自动配置,以便在主应用程序的类路径扫描中获取它。更多详情here
【讨论】:
【参考方案3】:您可以在库的“resources”文件夹中创建一个名为“META-INF”的文件夹,并添加一个名为“spring.factories”的文件,其内容为org.springframework.boot.autoconfigure.EnableAutoConfiguration=<fully_qualified_name_of_configuration_file>
。这将自动配置您的库。
【讨论】:
以上是关于Spring Boot:来自库项目的自动装配 bean的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 中实现通用 JPA 存储库 - 它可以自动装配到任何实体/类类型的 Spring 服务中