我正在努力从我的自定义库中自动连接bean,用gradle导入。读阅读几个类似的题目后,我仍然找不到解决办法。
我有一个Sping Boot 项目,它依赖于另一个项目(我的自定义库,包含组件,存储库等...)。这个库是一个Spring不可运行的jar,主要由域实体和存储库组成。它没有可运行的Application.class和任何属性...
当我启动应用程序时,我可以看到My 'CustomUserService' bean(来自库)正在尝试初始化,但其中自动连接的bean未能加载(接口UserRepository)...
错误:
com.myProject.customLibrary.configuration.CustomUserDetailsService中构造函数的参数0需要类型为“com.myProject.customLibrary.configuration.UserRepository”的Bean,但找不到该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条答案
按热度按时间euoag5mw1#
刚找到解决办法。我没有定义要从单独的库中扫描的基本包,而是在这个库中创建了配置类,并将其导入到我的主MyApplication.class中:
smdncfj32#
您可以在库的“resources”文件夹中创建一个名为“META-INF”的文件夹,并添加一个名为“spring.factories”的文件,其内容为
org.springframework.boot.autoconfigure.EnableAutoConfiguration=<fully_qualified_name_of_configuration_file>
。这将自动配置您的库。brccelvz3#
公认的答案太繁琐了。您需要做的是在库jar中实现您自己的自定义自动配置,以便在主应用程序的类路径扫描中获得它。更多详情here
vmpqdwk34#
这里有一个针对Sping Boot 3更新的答案,并归结为在另一个项目中自动装配库bean的要点“简单的方法”,其中库声明它们,其他项目不必知道它必须导入或指定的东西才能使用它们(一旦库首先是依赖项)。
首先,确保您的库包含resources文件夹中的
.imports
文件。这意味着,例如,如果你使用Maven,那么你的pom文件的<build>
部分的<resources>
将包含这样的资源:这一点很重要,因为Spring不再支持
.factories
文件(你可能已经使用过include
了),而是应该使用src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
,作为它的内容,只有你的自动配置类(如果你有多个自动配置类,每行一个):(If你的资源文件夹不是在
src/main/resources
然后替换为路径到你的资源文件夹的地方,它在这个答案中提到.)从这里开始,* 两个注解在自动配置类上显得必不可少 *。一个是
@AutoConfiguration
,它是新的自动配置导入系统的一部分。(这将替换imports文件中指定的autoconfiguration类上的@Configuration
。根据这些文档,引入的其他配置类应该继续使用@Configuration
。)第二个,
@ComponentScan
,将告诉它去从所有那些Spring类(@Component
,@Service
,@Controller
,@Repository
,@Bean
)中制作可自动连接的bean,这些类将在@SpringBootApplication
下自动成为bean。这个注解可以进一步定制,但是如果你把裸注解放在你的库的顶级包中的一个类上,它 * 应该 * 只找到那个包中的所有bean(即整个图书馆)。恭喜!有了这三个文件(好的,项目文件和其他两个文件中的设置),您的库的bean现在应该能够在使用该库的服务中成为
@Autowired
,而不需要服务将其视为与其自己的本地类有任何不同。您可能会发现您的autoconfigure类上的其他注解是需要的或有帮助的-例如,专门配置Repositories;或者如果你在
com.your.library.configuration
包中有AutoConfigure
类,那么它可以在@ComponentScan("com.your.library")
中指定基本包来获取configuration
包之外的bean。这个答案并不打算详尽地涵盖不同的Spring注解所做的事情以及可能与问题的代码示例相关的所有注解;相反,它侧重于问题所寻找的“缺失部分”:如何在依赖于库另一个项目中自动连接来自该库的那些bean。(如果你在Google上搜索如何在Sping Boot 中自动连接一个库bean/组件,而不是任何更通用或基本的版本,就会出现这个问题。从我的测试来看,这些似乎是让
@Autowired
工作的最低限度。