2013-08-21 1 views
0

reference을 기반으로 NamespaceHandler 및 BeanDefinitionParser를 사용하고 있으며 Bean 참조와 함께 Spel을 사용하고 싶습니다. 문제는 BeanDefinitionParser가 Spel 표현식을 해석 할 때 bean 참조로 spel을 평가할 수있는 BeanFactory를 가질 수 없도록 NamespaceHandler 또는 BeanDefinitionParser의 수명주기 단계로 인해 응용 프로그램 컨텍스트에 도달 할 수 없다는 것입니다. 이 문제를 어떻게 처리 할 생각입니까? SpEL이 bean 속성에 놓여 있다면 나는 그것을 남기고 봄을 해석 할 것이지만, 불행히도 SpEL은 bean 속성을 구성하는 데 사용될 객체 모델로 비 정렬화할 XML에 있습니다.NamespaceHandler 및 BeanDefinitionParser를 사용할 때 Spel Bean 참조를 사용할 수 없음

편집 : 게리 러셀의 조언에 따라

<bean id="securityDecriptor" class="com.fg.edee.integration.descriptor.security.SecurityDescriptorImpl"> 
    <property name="securityModuleName" value="security"/> 
    <property name="securityModuleDescription" value="security"/> 
</bean> 

<bean id="moduleDescription" class="com.fg.edee.integration.descriptor.schema.ModuleDescription"> 
    <property name="treeDescriptor"> 
     <mtd:treeDescriptor> 
      <mtd:security rights="W" moduleId="#{ securityDecriptor.securityModuleId }" moduleName="#{ securityDecriptor.securityModuleName }"> 
       <mtd:securityIdentifier identifierId="users" identifierName="users"/> 
      </mtd:security> 
     </mtd:treeDescriptor> 
    </property> 
</bean> 

답변

0

당신은 파서에서 그들을 평가할 수 없습니다; 문맥의 수명주기에 너무 이르다. 예를 들어 파서가 컨텍스트 초기화 중에 최종 객체를 생성하는 팩토리 빈에 대한 정의를 빌드하도록하는 방법은 여러 가지가 있습니다.

+0

그건 BeanDefinitionParser의 핵심입니다. 그렇지 않습니까? 내 "사용자 정의"XML에서 콩 정의를 만들지 만 콩 참조와 함께 거기에 spel을 사용해야합니다. 나는 너의 요점을 정말로 보지 못한다. "bean 정의 building"lifecycle 단계에서 참조 된 bean이 그것을 액세스하는 데 사용할 수 없다는 것을 이해하고 있지만 ... – lisak

+0

바로, bean이 아닌 bean'definitions'을 작성하고 있습니다. 이 시점에서 참조 할 다른 bean은 없으며 bean 정의 만 있습니다. 실제 참조는 bean 인스턴스화 단계에서만 작성되며, 모든 정의가 작성 될 때까지 시작되지 않습니다. 이 시점에서, 당신이 할 수있는 것은 당신의 bean 정의에'SpEL' 표현식을 추가하는 것입니다, 그것은 lated로 평가 될 것입니다. –

+0

글쎄, 문제는 만약 내가 BeanDefinitionParser에서 직접 평가하지 않는다면, SpEL이 빈 프로퍼티에 위치하지 않고 xml로 구성된 객체 모델 (마침내)에 위치하기 때문에 나중에 평가되지 않는다는 것이다. bean 속성에 할당 :-) 스 니펫에서 볼 수 있듯이 treeDescriptor 요소를 객체에 unmarshall하고 객체 treeDescriptor의 생성자에 할당합니다. – lisak