gpt4 book ai didi

java - 在 web 应用上下文中导入时,在 jar 文件中配置的 PersistenceUnit 具有错误的 PersistenceUnitRootLocation URL

转载 作者:行者123 更新时间:2023-12-04 02:53:44 25 4
gpt4 key购买 nike

我正在使用 Spring Boot Data JPA 和 Tomcat Starters,

我有一个应用程序,在多个 Maven 模块中定义了多个持久性单元,这些模块在独立使用时可以正常工作:

Project
-- IdentityAccess [PU name: identity-access]
|--- src/main/java
|--- myapp.application [Application services using "identityAccessTransactionManager"]
|--- myapp.domain.model [Entites classes]
|--- myapp.infrastructure.persistence [Repositories Impl using nested DataJpa repositories]
|--- src/main/resources
|--- myapp/application.properties
|--- myapp/hibernate.cfg.xml
|--- myapp/infrastructure/persistence/Group.hbm.xml
|--- myapp/infrastructure/persistence/GroupMember.hbm.xml
|--- myapp/infrastructure/persistence/User.hbm.xml

-- Promotion [PU name: promotion]
...

-- WebApplication [There is no PU here]
-> Depends on IdentityAccess, Promotion

@SpringBootApplication
@Import({IdentityAccessContext.class, PromotionContext.class})

以下是我如何在每个 PU 中配置我的 EntityManagerFactoryBean,为它们提供唯一的 bean 名称以避免冲突。 注意:以下Configuration是每个模块中包含的一个类

@Configuration
@ComponentScan
@EnableJpaRepositories(
transactionManagerRef = TRANSACTION_MANAGER,
entityManagerFactoryRef = ENTITY_MANAGER_FACTORY,
considerNestedRepositories = true)
public class IdentityAccessPersistenceConfiguration {
public static final String PERSISTENCE_CONTEXT = "identity-access";
public static final String ENTITY_MANAGER_FACTORY = "identityAccessEntityManagerFactory";
public static final String TRANSACTION_MANAGER = "identityAccessTransactionManager";

@Bean
public LocalContainerEntityManagerFactoryBean identityAccessEntityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSource);
entityManagerFactory.setJpaVendorAdapter(jpaVendorAdapter);
entityManagerFactory.setMappingResources("myapp/identityaccess/hibernate.cfg.xml");
entityManagerFactory.setPersistenceUnitName("identity-access");
return entityManagerFactory;
}

@Bean
public PlatformTransactionManager identityAccessTransactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory);
return transactionManager;
}

}

当我单独启动每个模块时,即在测试上下文中以及作为独立应用程序时,实体被正确加载和映射,PersistenceUnitInfoDescriptor 有一个根 URL,如下所示:

file:/F:/Workspaces/myapp/IdentityAccess/target/classes/

但是当我启动 web-app 时,每个 PU 都带有另一个根 URL,这是 web-app 上下文的根,因此它无法加载映射类:

file:/F:/Workspaces/myapp/WebApplication/target/WebApplication-1.0.0-SNAPSHOT/WEB-INF/classes/

它不应该是包含 PU 的 jar 吗?我试图 Hook setPersistenceUnitRootLocation 来放置我的 jar URL,但我被卡住了,因为版本和路径显然可以改变。我什至不知道这是一个错误还是我在做一些不受支持的事情。也许这个错误甚至不属于 Spring Boot 而属于 Spring 本身。

我觉得我触及了太多的内部结构,这就是为什么我认为它是一个错误,但如果不是,请纠正我,我已经在 spring boot github 上打开了一张具有相同描述的票。

我还看了: - https://github.com/spring-projects/spring-boot/issues/6983 - https://github.com/spring-projects/spring-boot/issues/6635 - https://github.com/spring-projects/spring-boot/issues/7003 - https://github.com/spring-projects/spring-boot/issues/7021

这似乎是相关的。

谢谢你的时间,

最佳答案

我解决了这个问题:

在 org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration 中,该方法假定持久化单元在应用程序本身中:

private URL determinePersistenceUnitRootLocation() {
Class<?> source = getClass();
try {
URL url = source.getProtectionDomain().getCodeSource().getLocation();
return ResourceUtils.extractJarFileURL(url);
}
catch (Exception ex) {
logger.info("Could not determine persistence " + "unit root location from "
+ source + " : " + ex);
}
return null;
}

源属于主webapp,所以类加载器放错了路径文件。

要解决我的问题,需要使用 jar 中的配置类在我的配置文件中使用相同的方法设置 RootPersistenceUnitRootLocation,并且该单元已从 JAR 中正确加载。

问题是:spring boot autoconfigure 应该改用持久性单元中的类,还是使用 setJarUrl 来包含适当的修复?还是仅支持一个主要持久性单元是一个坚定的选择?我认为自动配置并允许开箱即用的多个持久性单元(来自不同的 jar)会很棒,尤其是对于域驱动设计架构。

关于java - 在 web 应用上下文中导入时,在 jar 文件中配置的 PersistenceUnit 具有错误的 PersistenceUnitRootLocation URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40455892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com