0

다른 패키지의 엔티티를 검색하고 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 { 

} 

나는이 예외를 받고 있어요? 내가 뭔가를 감독하고 있니?

모든 힌트를 환영합니다.

답변

0

이러한 문제를 해결할 수있는 사람들을 위해.

"classpath*:%s/*.class" 

오류를 해결 :

"classpath:%s/*.class" 

에 변경 : 오류에 대한

이유는이 표현이었다.

문제는 첫 번째 표현식이 발견 된 첫 번째 경로를 보게된다는 것입니다. 이 클래스에서 필요로하는 일부 클래스는 이러한 오류 메시지를 발생시키는 엔티티와 같지 않습니다.

두 번째 표현식은 경로 패턴과 일치하는 모든 클래스 디렉토리를 검색하도록 ResourcePatternResolver에 지시합니다. 내 경우

../classes/package1/Entity.class 

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

, 그것은 단지로 이전에보고했다 :

희망이 사람을 도움이됩니다.

관련 문제