库项目中的EntityScan中断SpringBootApplication自动配置

时间:2018-11-29 20:37:19

标签: spring spring-boot spring-data-jpa entities

我正在尝试使用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添加到我不想的父项目中。

我认为我需要像在存储库中一样,找到一种手动在库中注册实体的方法,但是我做不到。

0 个答案:

没有答案