Spring Boot + Spring Data + Maven Modules = IllegalArgumentException不是托管类型

时间:2016-12-05 11:32:55

标签: spring-boot spring-data

我正在

  

通过构造函数参数0表示的不满意的依赖性;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为' clientSpringDataRepository'的init时出错:init方法的调用失败;嵌套异常是java.lang.IllegalArgumentException:不是托管类型:class com.foo.model.Client

这里最重要的是clientSpringDataRepository存储库在这里不会将@Entity客户端识别为托管类型。

我的项目是多模块的,所以:

\pom.xml
|
\model
   pom.xml
   /*com.foo.model.Client @Entity definition*/
\repository
   pom.xml
   /*com.foo.dao.ClientSpringDataRepository extends JpaRepository<Client, Long>" definition*/
...

当我将应用程序构建到WAR时,代码工作正常。当我通过主方法通过IntelliJ运行它时,它也有效。但是当我将构建更改为JAR并使java -jar在启动时失败时。

我的配置是:

a)模型

@Configuration
@EntityScan
@ImportResource({"classpath:model-context-core.xml",
                 "classpath:model-context-persistence.xml"})
public class ModelConfig {}

b)存储库

@Configuration
@Import(ModelConfig.class)
@ComponentScan(
    basePackages = "com.foo.dao",
    excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = JpaRepository.class)
)
@EnableJpaRepositories(basePackages = "com.foo.dao")
public class RepositoriesConfig {}

c)服务

@Configuration
@Import(RepositoriesConfig.class)
@ImportResource({"classpath:services-context.xml", "classpath:services-context-mail.xml"})
@ComponentScan(basePackages = {"com.foo.services", "com.foo.utils", "com.foo.context"})
public class ServicesConfig {}

d)休息

@Configuration
@Import(ServicesConfig.class)
@ImportResource("classpath:admin-rest-context.xml")
public class FooRestConfig extends WebMvcConfigurerAdapter {

  @Autowired
  private LocaleRequestFilter localeRequestFilter;

  // ------------- IncomingRequestFilter + Registration -------------
  @Bean
  Filter incomingRequestFilter(IVisibilityService visibilityService) {
    return new IncomingRequestFilter(visibilityService);
  }

e)主要

@SpringBootApplication
public class FooWebApp {

  public static void main(String[] args) {
    SpringApplication.run(FooWebApp.class, args);
  }
}

我的entityManagerFactory是:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan" value="com.foo.model"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaPropertyMap">
        <map>
            <entry key="hibernate.dialect" value="${hibernate.dialect}"/>
            <entry key="hibernate.show_sql" value="${hibernate.show_sql}"/>
            <entry key="hibernate.hbm2ddl.auto" value="${hibernate.hbm2ddl.auto}"/>
            <entry key="hibernate.format_sql" value="${hibernate.format_sql}"/>
            <entry key="hibernate.generate_statistics" value="${hibernate.generate_statistics}"/>
            <entry key="hibernate.use_sql_comments" value="${hibernate.use_sql_comments}"/>
            <entry key="hibernate.default_batch_fetch_size" value="${hibernate.default_batch_fetch_size}"/>
            <entry key="hibernate.cache.provider_class" value="${hibernate.cache.provider_class}"/>
            <entry key="hibernate.cache.use_second_level_cache" value="${hibernate.cache.use_second_level_cache}"/>
            <entry key="hibernate.cache.use_query_cache" value="${hibernate.use_query_cache}"/>
        </map>
    </property>
    <property name="persistenceUnitName" value="${jpa.persistenceUnitName}"/>
</bean>

我不确定它是否足够信息。我试图做出最小的例子,但它对我有用。在这里,我需要将现有应用程序重写为Spring-Boot,因此尝试提取最重要的信息。

当尝试创建包含对Spring-Data bean的引用的IVisibilityService bean时,它在d)中失败。

问题是我错过了什么?

2 个答案:

答案 0 :(得分:3)

在SpringBoot Main类上添加org.springframework.boot.autoconfigure.domain.EntityScan ...

@SpringBootApplication
@EntityScan("com.foo.model")
public class FooWebApp {

//这样它就会扫描你的实体包,并由Spring管理

答案 1 :(得分:0)

问题出在persistence.xml文件中(之前在项目中使用过)。 Spring正在寻找并覆盖spring boot实体。

删除了persistence.xml帮助。

有趣的是它使用的是WAR格式而不是JAR。但无论如何现在都有效。