首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PersistenceUnitPostProcessor实现在junit测试期间不工作

PersistenceUnitPostProcessor实现在junit测试期间不工作
EN

Stack Overflow用户
提问于 2015-01-21 23:53:23
回答 1查看 972关注 0票数 0

我已经实现了一个PersistenceUnitPostProcessor,用于扫描不同包中的实体,而不在persistence.xml中列出它们。

遗憾的是,它只在部署期间工作,而不是在运行junit测试时工作。

处理器在上下文应用程序xml中声明如下:

代码语言:javascript
复制
<bean id="entityManagerFactoryMdm"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitPostProcessors">
        <list>
            <bean class="com.mypackage.MyPersistenceUnitPostProcessor" />
        </list>
    </property>
</bean>

程序包按如下方式列出:

代码语言:javascript
复制
<util:properties id="entitiesScanProperties">
    <prop key="packagesToScan">package1.entities,package2.entities.view,package3.entities</prop>
</util:properties>

逻辑是:

代码语言:javascript
复制
public class MyPersistenceUnitPostProcessor implements PersistenceUnitPostProcessor {

    @Autowired
    private ResourcePatternResolver resourceLoader;

    @Value("#{entitiesScanProperties['packagesToScan']}")
    private String[] packagesToScan;

    @Override
    public void postProcessPersistenceUnitInfo(final MutablePersistenceUnitInfo mutablePersistenceUnitInfo) {
        try {
            List<Resource> resourcesList = new ArrayList<Resource>();
            for (String packageToScan : packagesToScan) {
                packageToScan = packageToScan.replace(".", "/");
                final Resource[] packageResources = resourceLoader.getResources(String.format("classpath:%s/*.class", packageToScan));
                resourcesList.addAll(Arrays.asList(packageResources));
            }
            final Resource[] resources = new Resource[resourcesList.size()];
            resourcesList.toArray(resources);

            for (Resource resource : resources) {
                final CachingMetadataReaderFactory cachingMetadataReaderFactory = new CachingMetadataReaderFactory();
                final MetadataReader metadataReader = cachingMetadataReaderFactory.getMetadataReader(resource);
                if (metadataReader.getAnnotationMetadata().isAnnotated(javax.persistence.Entity.class.getName())) {
                    mutablePersistenceUnitInfo.addManagedClassName(metadataReader.getClassMetadata().getClassName());
                }
            }
            mutablePersistenceUnitInfo.setExcludeUnlistedClasses(true);
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }
      }
    }

测试定义:

代码语言:javascript
复制
@ContextConfiguration(locations = { "classpath:application-context-test.xml" })
@DatabaseDataAsResource(locations = { "/META-INF/testdata/dbunit/master-dataset.xml", "/META-INF/testdata/dbunit/complaints-dataset.xml" })
public class FuelComplaintServiceImplIntegrationTest extends TestBase {
}

超类:

代码语言:javascript
复制
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class,
    TransactionalTestExecutionListener.class, TestExecutionLifecycleListener.class })
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public abstract class TestBase {

}

我得到了这个异常:

代码语言:javascript
复制
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private     com.company.repository.DataProviderRepository com.company.service.impl.ProviderConfigurationServiceImpl.dataProviderRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataProviderRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Not an managed type: class package1.entities.DataProviderEntity
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
... 43 more

处理器在耗尽期间工作,但在单元测试期间不工作,这可能是什么问题?我在监督什么吗?

任何提示都非常受欢迎。

EN

回答 1

Stack Overflow用户

发布于 2015-01-22 17:06:49

对于那些可能遇到这样的问题的人。

错误的原因是这个表达式:

代码语言:javascript
复制
"classpath:%s/*.class"

将其更改为:

代码语言:javascript
复制
"classpath*:%s/*.class"

已解决错误。

问题是,第一个表达式将只查找找到的第一个路径。一些需要的类将不在那里,比如本例中导致此类错误消息的实体。

第二个表达式将告诉ResourcePatternResolver查找与路径模式匹配的所有类目录,例如

代码语言:javascript
复制
../classes/package1/Entity.class

../test-classes/package1/ServiceTest.class

在我的例子中,它以前只是为了:

代码语言:javascript
复制
../test-classes/package1/ServiceTest.class

希望这对某些人有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28071413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档