복붙노트

[SPRING] context : property-placeholder가 참조를 해석하지 않습니다.

SPRING

context : property-placeholder가 참조를 해석하지 않습니다.

classpath의 루트에 다음 applicationContext.xml 파일이 있습니다.

<context:annotation-config />

    <context:property-placeholder location="classpath:props/datasource.properties"  />

    <bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"
        p:username="${jdbc.username}" 
        p:password="${jdbc.password}" 
        p:url="${jdbc.url}"
        p:driverClassName="${jdbc.driverclass}" 
        p:validationQuery="SELECT sysdate FROM dual" />

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
        p:dataSource-ref="datasource" 
        p:mapperLocations="classpath:mappers/*-mapper.xml" />

    <tx:annotation-driven transaction-manager="txManager" />
    <bean id="txManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
        p:dataSource-ref="datasource" />

    <bean id="mappeScannerConfigurere" class="org.mybatis.spring.mapper.MapperScannerConfigurer"
        p:sqlSessionFactory-ref="sqlSessionFactory" 
        p:basePackage="com.mypackage" />

props / datasource.properties도 classpath의 루트에 다음과 같은 내용으로 존재합니다.

jdbc.url=myjdbcurl
jdbc.driverclass=myClass
jdbc.username=myUserName
jdbc.password=myPassword

Spring 관리 테스트에서 다음 주석을 통해 앞에서 언급 한 applicationContext.xml을 사용하도록 선언합니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})

테스트 메소드를 호출하면 봄부터 다음 오류가 발생합니다.

org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${jdbc.driverclass}'

sping이 jdbc.driverclass에 대한 참조를 해결하지 못한다는 것을 이해합니다. 나는 무엇을 잘못 했는가?

추신 : 봄 3.2.3.RELEASE 사용하고 있습니다.

**

**

아마도 MapperScannerConfigurer에 문제가있을 수 있습니다. 그것은 BeanDefinitionRegistryPostProcessor이고 Javadoc은 말합니다 :

따라서 MapperScannerConfigurer는 sqlSessionFactory를 통해 BeanFacoryPostProcessor (를 담당 함)를 통해 데이터 소스 객체를 활용하지 않습니다. 그래서 내 질문에 및 BeanDefinitionRegistryPostProcessor (MapperScannerConfigurer)에서 BeanFacoryPostProcessor를 재정렬하는 방법으로 변환됩니까?

두 시간의 조사 끝에 해결책을 찾았습니다.

앞서 말했듯이 MapperScannerConfigurer는 를 담당하는 BeanFactoryPostProcessor 앞에 실행되는 BeanDefinitionRegistryPostProcessor입니다. 따라서 MapperScannerConfigurer를 만드는 동안 외부 속성에 대한 참조가 확인되지 않습니다. 이 경우 BeanFactoryPostProcessor가 적용된 후 데이터 소스 생성을 연기해야합니다. 우리는 여러 가지 방법으로 그렇게 할 수 있습니다.

해결법

  1. ==============================

    1.나는 똑같은 문제를 안고이 게시물을 보았지만 maks와 같은 방식으로 해결할 수 없었다. 결국 나를 위해 일한 것은 ignoreUnresolvablePlaceholders 속성 값을 true로 설정하는 것이 었습니다.

    나는 똑같은 문제를 안고이 게시물을 보았지만 maks와 같은 방식으로 해결할 수 없었다. 결국 나를 위해 일한 것은 ignoreUnresolvablePlaceholders 속성 값을 true로 설정하는 것이 었습니다.

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <value>classpath:database.properties</value>
        </property>
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
    </bean>
    

    나는 Spring 3.2.3.RELEASE도 사용하고있다. 이 게시물은 4 개월 이상 된 것으로 알고 있지만 누군가 유용하다고 생각했습니다.

  2. ==============================

    2.짧은 형식 : 구현을로드하는 적절한 방법은 무엇입니까? BeanDefinitionRegistryPostProcessor?

    짧은 형식 : 구현을로드하는 적절한 방법은 무엇입니까? BeanDefinitionRegistryPostProcessor?

    펼친 양식 : 빈이 생성되기 전에 BeanDefinitionRegistryPostProcessor를로드 할 수있는 방법이 있습니까? javadoc을 보면 :

    따라서 bean 정의가 생성되었을 때, 그러나 bean이 생성되기 전에로드되도록되어 있습니다. 우리가 응용 프로그램 xml에서 일반 빈으로 만들면 처음에는이 빈을 갖는 목적을 상실합니다.

  3. from https://stackoverflow.com/questions/17512596/contextproperty-placeholder-doesnt-resolve-references by cc-by-sa and MIT license