다른 패키지의 엔티티를 검색하고 persistence.xml에 나열하지 않는 PersistenceUnitPostProcessor를 구현했습니다.PersistenceUnitPostProcessor junit 테스트 중에 구현이 작동하지 않습니다.
슬프게도, 배포 중에 만 작동하지만 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 {
}
슈퍼 클래스 : 프로세서가 druing 단위 테스트를 deplyoment 동안 작동하지만하지 않는 것이,
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
무슨 문제가 될 수 있습니다 :
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class, TestExecutionLifecycleListener.class })
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public abstract class TestBase {
}
나는이 예외를 받고 있어요? 내가 뭔가를 감독하고 있니?
모든 힌트를 환영합니다.