我们正在寻找不同模块分别指定@ComponentScan、@EnableJpaRepositories和EntityManagerFactory的方法。setPackagesToScan。
我们将多个代码模块组合到Web应用程序中。此外,我们允许对基本代码进行客户特定的扩展,可以添加额外的包。在我的测试中,我发现我可以添加一个额外的java配置类,并且在@ComponentScan和@EnableJpaRepository中添加了额外的包。我在想,如果我可以使用@EntityScan,我会看到类似的行为。
但是,我们正在EntityManagerFactory中执行一些定制,因此@EntityScan不再是一个选项。我认为我们不想为每个模块指定另一个EntityManagerFactory。方法setPacakgesToScan执行包的替换(而不是添加到当前列表)。
已经有很多关于有问题地设置包的能力的帖子ToScan,但这似乎大大增加了复杂性。
基本配置类示例
@Configuration
@EnableJpaRepositories(basePackages = {
"a", "b", "c"
}
,repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class
)
@ComponentScan(basePackages = {
"a", "b", "c"
}
)
public class BaseConfig {
@Bean
public EntityManagerFactory entityManagerFactory() throws NamingException {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setJtaDataSource(dataSource());
emf.setPackagesToScan(new String[] {"a", "b", "c"})
}
}
扩展配置类示例
@Configuration
@EnableJpaRepositories(basePackages = {
"d"
}
,repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class
)
@ComponentScan(basePackages = {
"d"
}
)
public class ExtensionConfig {
@Bean
public EntityManagerFactory entityManagerFactory() throws NamingException {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setJtaDataSource(dataSource());
emf.setPackagesToScan(new String[] {"d"})
}
}
有没有其他方法可以实现这种行为?
谢谢。
你可以尝试以下方法,尽管我不确定这是最好的方法:
为包列表创建一个持有人类。它必须可由客户端扩展模块访问:
public class EmfPackages {
private final String[] packages;
public EmfPackages(String[] packages) {
this.packages = packages;
}
public String[] getPackages() {
return this.packages;
}
}
然后调整两个配置类:
public class BaseConfig {
@Bean
public EMFPackages baseEmfPackages() {
return new EmfPackages(new String[] {"a", "b", "c"});
}
@Bean
// both "holders" are now injected here
// AFAIK this feature works in Spring 4+
public EntityManagerFactory entityManagerFactory(List<EmfPackages> emfPackages) throws NamingException {
// actually this is Java 8+ style, adjust for lower versions if needed
final String[] combinedPackages = emfPackages.stream()
.flatMap(p -> Arrays.stream(p.getPackages()))
.collect(Collectors.toList())
.toArray(new String[0]{});
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setJtaDataSource(dataSource());
emf.setPackagesToScan(combinedPackages)
}
}
public class ExtensionConfig {
@Bean
public EmfPackages extendedEmfPackages() {
return new EmfPackages(new String[] {"d"});
}
}
我正在开发Spring MVC Web应用程序,它使用JDBC Quartz Scheduler来执行作业。这个Web应用程序有多个服务,每个服务都打包为jar并具有关联的作业。我在Web项目中有一个石英配置,在该配置下我为作业、触发器和调度程序创建了bean。在调度程序配置下,我指定了触发器列表。当我们开始我们的项目时,这很好。随着我们开始添加功能,作业数量增加,现在大约有100个。维护这个文件
尝试基于以下内容设置应用程序时出错:SPRING-DATA-JPA, GWT项目。尝试在托管模式下运行时出现异常: 嵌套在org.springframework.beans.factory.BeanCreationException:创建名称为org.springframework.dao.annotation.的bean时出错:bean初始化失败;嵌套异常是org.springframework
我将spring项目和spring数据JPA拆分为多个模块 > 项目-根-文件夹 项目数据 src/main/java/project。测试/应用程序。爪哇 src/main/resources/log4j2。xml 波姆。xml src/main/java/project.test/App.java src/main/ressource/log4j2.xml pom.xml 项目根文件夹/pom
我正在读《Web应用程序的专业Java——尼古拉斯·威廉姆斯》这本书的例子对Spring Data JPA有这样的配置: 但我一直在使用XML进行配置,我不知道如何仅将其转换为XML,到目前为止我已经有了这个 有谁能指导我如何转换这个吗? 谢谢
一、简介 黄页模块的基本设置 二、基本设置 三、SEO设置 二、权限设置
SOFABoot 模块是一个普通的 Jar 包加上一些 SOFABoot 特有的配置,这些 SOFABoot 特有的配置,让一个 Jar 包能够被 SOFABoot 识别,使之具备模块化的能力。 一个完整的 SOFABoot 模块和一个普通的 Jar 包有两点区别: SOFABoot 模块包含一份 sofa-module.properties 文件,这份文件里面定义了 SOFABoot 模块的名称