• 2
  • 新人请关照

Junit启动有spring-boot-starter-data-jpa依赖的容器报错,怎么解决?

在自己的springboot项目中添加spring-boot-starter-data-jpa后,在对自己的repository用junit做单元测试的时候。当通过junit test case 启动容器的时候会出现一大堆

[Xlint:cantFindType]
[AppClassLoader@xxxx] error can't determine implemented interfaces of missing type xxxx的错误在控制台(详细的堆栈信息见截图)。并且会导致我的 Springboot Data repository Scanning变的特别慢。
[ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 41625ms.

奇怪的是,报错不会影响容器启动也不会fail我的case,更奇怪的是当我直接 run 我的SpringApplication类启动容器的时候,不会有报错的信息也Springboot Data repository Scanning非常快,没有变慢。

这两个问题发生的背景是在我给项目加上spring-boot-starter-data-jpa依赖后发生的。Springboot的版本尝试过2.0.3然后升级到最新的release版本都有这个问题。是不是我的junit case缺什么配置吗?

也尝试过改用TestNg,问题同样复现。

相关代码

App:

@SpringBootApplication
//@EnableDubboConfiguration
public class DubboCallerApplication {

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(DubboCallerApplication.class);
    app.setBannerMode(Banner.Mode.OFF);
    app.run(args);
}

}

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DubboCallerApplication.class)
public class JpaTest{

@Autowired
DeviceRepository deviceRepository;

@Test
public void test(){
    Device device = deviceRepository.findDevice("xxxxx");
    System.out.println(device);
}

}

Repository类:

@Repository
public interface DeviceRepository extends JpaRepository<Device, Integer> {

@Query("select d from Device d where device_id = ?1")
public Device findDevice(String device_id);

@Query("update Device set create_time = ?2 where device_id = ?1")
public Device findDevice(String device_id, long create_time);

}

数据源配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(

    entityManagerFactoryRef = "entityManagerFactoryMember",
    transactionManagerRef = "transactionManagerMember",
    basePackages = {"com.xxx.apicaller.dao.member"}

)
public class MemberDataSourceConfig {

//注入数据源
@Autowired
@Qualifier("memberDataSource")
private DataSource memberDataSource;

//配置EntityManager实体
@Primary
@Bean(name="entityManagerMember")
public EntityManager entityManager(EntityManagerFactoryBuilder builder){
    return entityManagerFactoryMember(builder).getObject().createEntityManager();
}

//配置EntityManager工厂实体
@Primary
@Bean(name="entityManagerFactoryMember")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryMember(EntityManagerFactoryBuilder builder){
    return builder
            .dataSource(memberDataSource)
            .properties(getVendorProperties())
            .packages("com.xxx.apicaller.domain.member")
            .persistenceUnit("memberPersistenceUnit")
            .build();
}

//注入Jpa实体
@Autowired
private  JpaProperties jpaProperties;

//获取Jpa配置信息
private Map<String, String> getVendorProperties(){
    return jpaProperties.getProperties();
}

//配置事务
@Primary
@Bean(name="transactionManagerMember")
public PlatformTransactionManager transactionManagerMember(EntityManagerFactoryBuilder builder){
    return new JpaTransactionManager(entityManagerFactoryMember(builder).getObject());
}

}

报错虽然不会fail case,也不会启动不了容器,但是看着这些报错信息贼难受,而且repository的扫描时间这么长更难受了。有能帮忙解决一下的吗。

图片描述

阅读 839
评论
    1 个回答

    可以考虑一下是否是包冲突的问题,异常显示由于缺失xxx类无法确定继承的接口

      撰写回答

      登录后参与交流、获取后续更新提醒