41

我正在努力从使用 gradle 导入的自定义库中自动装配 bean。在阅读了几个类似的主题后,我仍然无法找到解决方案。

我有一个依赖于另一个项目的 Spring Boot 项目(我的带有组件、存储库等的自定义库)。这个库是一个 Spring 不可运行的 jar,主要由域实体和存储库组成。它没有可运行的 Application.class 和任何属性...

当我启动应用程序时,我可以看到我的“CustomUserService”bean(来自库)正在尝试初始化,但其中自动装配的 bean 无法加载(接口 UserRepository)......

错误:

com.myProject.customLibrary.configuration.CustomUserDetailsS​​ervice 中构造函数的参数 0 需要一个无法找到的“com.myProject.customLibrary.configuration.UserRepository”类型的 bean。

我什至尝试设置'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);

    ...
}
4

3 回答 3

78

刚刚找到解决方案。我没有定义要从单独的库中扫描的基础包,而是在这个库中创建了带有大量注释的配置类,并将其导入到我的主 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 {}
于 2017-01-23T22:11:44.123 回答
4

您可以在库的“resources”文件夹中创建一个名为“META-INF”的文件夹,并添加一个名为“spring.factories”的文件,其内容为org.springframework.boot.autoconfigure.EnableAutoConfiguration=<fully_qualified_name_of_configuration_file>. 这将自动配置您的库。

于 2021-09-04T09:29:32.433 回答
3

接受的答案太麻烦了。您需要做的是在您的库 jar 中实现您自己的自定义自动配置,以便在主应用程序的类路径扫描中获取它。更多细节在这里

于 2021-08-08T15:23:04.847 回答