我正在尝试使用spring建立一个库,该库将处理其他spring boot应用程序的任务管理。我的图书馆包括服务,存储库和实体。图书馆将使用父项目的数据源作为实体。我的目标是在其他Spring项目中仅使用@EnableTask批注使用任务管理库。
要做到这一点,我已经准备好我的库,它可以按预期工作。但是,当我尝试将此库导入到Spring Boot应用程序时,库中的存储库和实体不可用。
我的EnableTask批注:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(TaskConfig.class)
public @interface EnableTask {
}
和TaskConfig
@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);
}
}
它奏效了...
现在我把所有东西弄乱了!通过这种配置,我已经意识到我的Task实体不是托管类型。
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添加到我不想的父项目中。
我认为我需要像在存储库中一样,找到一种手动在库中注册实体的方法,但是我做不到。