我已经实现了一个PersistenceUnitPostProcessor,用于扫描不同包中的实体,而不在persistence.xml中列出它们。
遗憾的是,它只在部署期间工作,而不是在运行junit测试时工作。
处理器在上下文应用程序xml中声明如下:
<bean id="entityManagerFactoryMdm"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitPostProcessors">
<list>
<bean class="com.mypackage.MyPersistenceUnitPostProcessor" />
</list>
</property>
</bean>程序包按如下方式列出:
<util:properties id="entitiesScanProperties">
<prop key="packagesToScan">package1.entities,package2.entities.view,package3.entities</prop>
</util:properties>逻辑是:
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);
}
}
}测试定义:
@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 {
}超类:
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class, TestExecutionLifecycleListener.class })
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public abstract class TestBase {
}我得到了这个异常:
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处理器在耗尽期间工作,但在单元测试期间不工作,这可能是什么问题?我在监督什么吗?
任何提示都非常受欢迎。
发布于 2015-01-22 17:06:49
对于那些可能遇到这样的问题的人。
错误的原因是这个表达式:
"classpath:%s/*.class"将其更改为:
"classpath*:%s/*.class"已解决错误。
问题是,第一个表达式将只查找找到的第一个路径。一些需要的类将不在那里,比如本例中导致此类错误消息的实体。
第二个表达式将告诉ResourcePatternResolver查找与路径模式匹配的所有类目录,例如
../classes/package1/Entity.class
../test-classes/package1/ServiceTest.class在我的例子中,它以前只是为了:
../test-classes/package1/ServiceTest.class希望这对某些人有帮助。
https://stackoverflow.com/questions/28071413
复制相似问题