2014-10-01 3 views
2

스프링 구성을 포함하는 jar가 있습니다. 항아리 내부에 웹 서비스 주소를 구성하기 위해 일부 JNDI 변수를 검색하고 있습니다. 이제 스프링 배치 (Spring Batch)에서 동일한 병을 사용하고 있으며 동일한 스프링 구성 파일을 사용하고 싶습니다.jndi 변수를 속성 자리 표시 자로 노출

내 문제는 내가 (@Value로 내 변수를 얻을 수있는이

<context:property-placeholder system-properties-mode="OVERRIDE" ignore-unresolvable="true" /> 

를 사용하여

java -DmyFoo=bar 

내 일괄 처리 시스템 등록 정보로 웹 서비스 주소를 전달하고 있다는 점이다 "myFoo ")

제 질문은 : 내 속성 자리 표시 자에서 JNDI 변수를 가져올 수있는 방법이 있습니까? 또는 JNDI로 가져 와서 속성 자리 표시 자에 노출시킬 수 있습니까?

은 내가 할 수 있기를 원하는 것은 교체이다이 나는 마침내 내가 필요한 것을 만드는 트릭을 발견이

<bean id="MBean" class="com.xxx.utils.ActivationMBean"> 
    <property name="makeCall" value="${semantic.activation}" /> 
</bean> 
+0

대신 'PropertySourcesPlaceHolderConfigurer'를 사용하십시오. 대신 네임 스페이스 ''를 사용하는 것이 좋습니다. –

+0

좋아, 내가 한 일괄 처리에서이 일을했지만 어떻게 $ {semantic.activation}으로 JNDI를 얻을 수 있습니까? – ydemartino

+0

'semantic.activation'이'JndiPropertySource'를 사용하여 해결되었다는 것을 알았는지 확실하지 않습니다. 그래서 당신은'ProperySourcesPlaceHolderConfigurer'를 사용하고 있다고 가정하고 이미 검색 중입니다. 따라서 기본적으로 교체 작업은 추가 작업없이 이미 수행되어야합니다. 버전이없는'spring-context.xsd' 또는 적어도 버전 3.0을 사용하고 있는지 확인하십시오. 그렇지 않으면 여전히 PropertyPlaceHolderConfigurer가됩니다. –

답변

3

<context:property-placeholder />을 사용하는 경우 PropertySourcesPlaceholderConfigurer이 등록됩니다. (스프링 3.1 이상에서 xsd 버전을 사용하지 않거나 버전 3.0 이상을 사용하고있는 경우). property-source abstraction은 Spring 3.1에서 추가되었습니다.

PropertySourcesPlaceholderConfigurer은 구성된을 사용하여 자리 표시 자에 대한 값을 가져옵니다. PropertySource은 요소의 location 속성을 통해 환경, 웹 또는 비 웹 및 @PropertySource 주석 또는로드 된 속성 파일의 양에 따라 달라집니다.

StandardServletEnvironment (웹)의 경우 PropertySource은 다음 순서로 문의합니다.

    는 는
  1. 의 ServletContext는 INIT-PARAMS는
  2. 는 는
  3. 의 ServletContext는 상황에 PARAMS는
  4. JndiPropertySource는
  5. 은 시스템 등록 정보는
  6. StandardEnvironment (비 웹)의 시스템 환경은

PropertySource들 자문을 다음과 같은 순서로등록 정보 파일에서로드 localOverride 속성 속성의 설정에 따라

  1. 시스템 등록 정보는
  2. 시스템 환경

목록의 하단 (false) 가기 (true) 또는 추가됩니다 상담하려면 PropertySource입니다.

다음과 같은 bean 정의가 주어진다. 이은 (는) 시스템 등록 정보에 폴백 것이다 발견되지 않는 경우 자리 ${semantic.activation} 먼저 JNDI 트리에 대한 resolved을하고있는 웹 환경에서

<bean id="MBean" class="com.xxx.utils.ActivationMBean"> 
    <property name="makeCall" value="${semantic.activation}" /> 
</bean> 

. 웹이 아닌 경우에는 JNDI 조회가 시도되지 않고 -D 또는 환경에서 지정된 특성을 참조합니다.

+0

이 문제를 해결할 수 있도록 협조 해 주셔서 감사합니다. 내가 놓친 것은 2 개의 파일을 사용하고 "http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context"를 입력하지 않았다는 것입니다. xsd "두 번째 파일에. 이걸 추가하면 내 문제가 해결됩니다. 정말 고맙습니다! – ydemartino

0

으로

<bean id="MBean" class="com.xxx.utils.ActivationMBean"> 
    <property name="makeCall"> 
     <jee:jndi-lookup jndi-name="semantic.activation" /> 
    </property> 
</bean> 

:

<bean id="MBean" class="com.xxx.utils.ActivationMBean"> 
    <property name="makeCall"> 
     <jee:jndi-lookup jndi-name="semantic.activation" default-value="${semantic.activation}" /> 
    </property> 
</bean> 

그것을 @Value 주석과 함께 사용할 수는 없지만 JNDI를 사용하는 경우에는이를 취하여 속성으로 폴백하지 않습니다. 아무 것도 정의되지 않았다면 시작하지 못할 것이고 그것은 내가 원했던 것입니다.

+0

또한'PropertySourcesPlaceHolderConfigurer'가'JndiPropertySource'를 참조하여 무엇을하는지 알려줍니다. 당신은 복잡한 방향으로 나아가고 있습니다. 설명하려고 할 때 이것이'PropertySource'의 소개 이후의 기본 행동입니다. –

+0

은 java : comp/env/semantic.activation 변수를 검색합니다. 하지만 JNDI 서비스가없는 배치에서 어떻게 사용할 수 있습니까? 그래서 java -Dsemantic.activation 시스템 속성으로 채울 기본값을 가져야합니다. – ydemartino

관련 문제