spring - 库项目中的 EntityScan 破坏 SpringBootApplication 自动配置
问题描述
我正在尝试使用 spring 构建一个库,它将处理其他 spring boot 应用程序的任务管理。我的库包括服务、存储库和实体。库将使用父项目的数据源作为实体。我的目标是在其他 Spring 项目中使用任务管理库,仅使用 @EnableTask 注释。
为此,我准备了我的库,它可以按预期工作。但是,当我尝试将此库导入 Spring Boot 应用程序时,库中的存储库和实体不可用。
我的 EnableTask 注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(TaskConfig.class)
public @interface EnableTask {
}
和任务配置
@Configuration
@ComponentScan("com.cbidici.task")
public class TaskConfig {
}
为了从注册的库中创建存储库,我更改了我的配置类,如下所示。
@Configuration
@ComponentScan("com.cbidici.task")
public class TaskConfig {
@Bean
public TaskRepository taskRepository(EntityManager entityManager) {
JpaRepositoryFactory jpaRepositoryFactory=new JpaRepositoryFactory(entityManager);
return jpaRepositoryFactory.getRepository(TaskRepository.class);
}
}
它奏效了……
现在我把一切都搞砸了!使用此配置,我的任务实体不是托管类型有一个例外。
Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.cbidici.task.entity.Task
at org.hibernate.metamodel.internal.MetamodelImpl.managedType(MetamodelImpl.java:552) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:74) ~[spring-data-jpa-2.1.2.RELEASE.jar:2.1.2.RELEASE]
为了使实体注册,我尝试将 EntityScan 添加到我的 TaskConfig 类中。这弄乱了 SpringBootApplication 并且我的父项目本身不扫描实体。
我发现了这个问题,并且有一个解决方案。 https://github.com/spring-projects/spring-boot/issues/6141
但是,此解决方案包括将@EnableJpaRepositories、@EntityScan 添加到我不想添加的父项目中。
我想我需要找到一种方法来手动注册库中的实体,就像我为存储库所做的那样,但我做不到。
解决方案
推荐阅读
- java - 如何始终在 Firebase 中存储/检索双打
- java - org.apache.kafka.connect.errors.DataException:结构模式不匹配
- php - Symfony 3.4 如何设置语言环境
- spring - 非 bean 的 Spring Boot 配置
- php - 我想在 $employee_salary 数组中的 $employee 数组中添加薪水键
- node.js - 如何使用momentjs获取UTC的昨天开始时间
- java - java.net.ProtocolException:方法不支持请求正文:GET
- amazon-web-services - 究竟是什么意思 AWS 区域并为业务选择正确的区域
- python - 此代码中的错误“名称错误:名称未定义”是什么意思
- c++ - std::string::reserve 会改变 std::string 的大小吗?