当在Spring Java Config class中定义EntityManager时,我可以通过调用相应构建器上的方法来添加基本包以扫描Entity class:
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
// Some other configuration here
builder.packages("org.foo.bar", "org.foo.baz");
return builder.build();
}
对于Spring查找Repository Interfaces的地方,我需要类似的东西。通常的方法是使用@EnableJpaRepositories
注解:
@EnableJpaRepositories(basePackages = {"org.foo.barbaz"})
但是我希望有一个动态的方法来定义这些包,类似于上面的实体位置。就像这样:
public SomeJpaRepositoryFactoryBean entityManagerFactory(JpaRepositoryFactoryBuilder builder) {
// Some other configuration here
builder.packages("org.foo.barbaz");
return builder.build();
}
有没有一种方法可以在当前的Spring Data JPA版本中做到这一点?它根本就不应该这样做吗?
8条答案
按热度按时间u5i3ibmn1#
您可以使用
@AutoConfigurationPackage
注解将子模块的包添加到scan-packages。1.从您的子模块中删除所有
@EnableJpaRepositories
1.将
@AutoConfigurationPackage
类添加到您的子模块的top目录(类似于@SpringBootApplication
,您必须将该类放置到最顶层目录才能扫描所有子包):1.在您的子模块的**
/resources/META-INF/spring.factories
**下创建spring.factories
文件,添加配置类:org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.child.package.ChildConfiguration
现在,您可以从核心项目
@Autowired
您的存储库。(已测试和工作)0sgqnhkj2#
不带Sping Boot (纯Spring MVC设置)
@EnableJpaRepositories
可以在多个@Configuration
类上使用。也就是说,每个模块都可以通过拥有自己的配置类来声明自己的存储库:然后Spring Data JPA会将它们全部计算在内(
package1
和package2
)。虽然这仍然不是一个程序化的方法,但它解决了我的问题。
ccgok5k53#
这个问题也困扰了我差不多一个星期,我一行一行调试“spring application context refresh”代码和
org.springframework.data.jpa.repository.config.JpaRepositoriesRegistrar
,然后解决了这个问题。我定制了
EnableJpaRepository
注解和JpaRepositoriesRegistrar
,然后我可以在AbdJpaRepositoriesRegistrar
中做任何事情(“abd”是我定制的类的前缀)。AbdEnableJpaRepositories.java
AbdJpaRepositoriesRegistrar.java
AbdRepositoryBeanDefinitionRegistrarSupport.java
AbdAnnotationRepositoryConfigurationSource.java.你可以覆盖
getBasePackages
,然后你可以返回任何你想要的包。如何使用?这里是配置文件。PrimaryJpaConfiguration.java
您可以将
spring.jpa.base-packages
配置添加到application.properties。例如:spring.jpa.base-packages=com.foo.a,com.bar.b
,以及那些包“com.foo.a”和“com.bar.b”下的存储库和实体将被添加到spring Ioc容器中。ipakzgxi4#
Answer by 高慧觉 Spring Data JPA - How to programmatically set JpaRepository base packages worked for me, but I've come up with a simpler and more reliable
AnnotationRepositoryConfigurationSource
implementation: just allow Spring Data to collect the packages in its way, and then post-process them and expand property placeholders to package names.sauutmhj5#
我实现了一种纯编程方式调用
@EnableJpaRepositories
的方法。为此,我创建了一个类,它模拟了传递给配置类的Annotation数据,该配置类使用@EnableJpaRepositories
注解进行注解。我叫我的班级EnableJpaRepositoriesData
。它被确认与Spring 5.1.5,SpringBoot 2.1.3一起工作。我猜它必须兼容早期和后期版本一样,没有或很少的变化,在最多。下面是类代码,以及它的示例使用代码。
EnableJpaRepositoriesData.java:
通过编程方式实际调用enableJpaRepositories的Class用法示例**:**
最后,如果你不知道,可以使用下面的@Configuration类
...重写它的两个方法,让后处理bean
registry
和applicationContext
可以动态注册bean定义。要重写的方法:p4tfgftt6#
我只是参考了这篇文章,并在github中为mysql创建了一个模块感知的多数据库感知的spring数据库(与spring Boot 兼容)。需要添加一些应用程序属性,你就完成了。
文件和其他详细信息可在以下网址找到:-
https://github.com/yatharthamishra0419/spring-boot-data-multimodule-mysql
hkmswyz67#
从
code-in-the-middle
的Angular 来看,有一种方法可以将所需的功能注入到确切的代码位置,以实现dynamic basePackages value
功能,这里的dynamic
是指runtime
。设法通过以下逻辑绕过现有的Spring限制(代码被简化,以突出
code-in-the-middle
解决方案本身)。1.应用程序JPA配置类
EnableJpaRepositories
注解的自定义版本org.springframework.data.repository.config.RepositoryBeanDefinitionRegistrarSupport
类的自定义版本xzv2uavs8#
你要找的是
@EntityScan
,但它只在Sping Boot 中可用。您可以在Spring Data JPA中注解的配置记录在这里https://docs.spring.io/spring-data/jpa/docs/2.0.8.RELEASE/reference/html/#jpa.java-config