2011-03-09 6 views
9

나는 @Interceptors(SpringBeanAutowiringInterceptor.class)을 사용하여 EJB에 스프링 빈을 주입하려고하는데, 내가 본 적이있는 beanRefContext.xml 예제로 작업 할 수 없다. 이 콩을 재현하는 대신 기존의 ApplicationContext를 얻는 것 같다,EJB3에 스프링 빈 삽입하기

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="..."> 

    <!-- Have also tried with ClassPathXmlApplicationContext --> 
    <bean id="context" 
     class="org.springframework.web.context.support.XmlWebApplicationContext"> 
     <property name="configLocations" value="/config/app-config.xml" /> 
    </bean> 

</beans> 

그러나 다음과 같이 나는 beanRefContext.xml로를 제공 한

@Stateless 
@Interceptors(SpringBeanAutowiringInterceptor.class) 
public class AlertNotificationMethodServiceImpl implements 
     AlertNotificationMethodService { 

    @Autowired 
    private SomeBean bean; 
} 

:

여기 내 EJB입니다. 내 콩 중 하나가 ServletContextAware이기 때문에 다음 예외로 끝납니다.

java.lang.IllegalArgumentException: Cannot resolve ServletContextResource 
without ServletContext 

는 ApplicationContext를을 얻기 대신 새로 만들 안의 SpringBeanAutowiringInterceptor를 사용하는 경우?

또한 contextConfigLocation이 beanRefContext.xml을 가리 키도록 내 web.xml을 변경해 보았습니다. Spring 구성을로드해야하지만 위와 같은 예외가 발생하기를 바랍니다.

누구든지 올바르게 수행하는 방법을 알고 있습니까? 내가 본 예제는 내가 사용하고있는 것과 같은 방법을 사용하는 것으로 보이는데, 이는 인터셉터가 호출 될 때 빈이 다시 만들어지고 있다는 것을 의미합니다 (또는 그것이 작동하는 방법과 오해했습니다).

+0

전체 프로세스를 설명하는 유용한 링크 : http://techo-ecco.com/blog/spring-application-context-hierarchy-and-contextsingletonbeanfactorylocator/ – omartin

답변

11

SpringBeanAutowiringInterceptor을 사용하는 경우 새 번호를 작성하는 대신 ApplicationContext을 얻지 않아야합니까?

예, 실제로 이것이 무엇입니까. ContextSingletonBeanFactoryLocator 메커니즘을 사용하여 많은 수의 ApplicationContext 인스턴스를 정적 ​​싱글 톤으로 관리합니다 (예, 스프링이 때때로 정적 싱글 톤을 사용해야하는 경우조차도). 이러한 컨텍스트는 beanRefContext.xml에 정의됩니다.

귀하의 혼란은 이러한 상황이 귀하의 webapp의 ApplicationContext과 관련이 있다는 기대에서 비롯된 것 같습니다. 그들은 그렇지 않습니다. 그들은 완전히 별개입니다. 그래서 당신의 webapp의 ContextLoader은 빈 정의에 기반한 컨텍스트를 생성하고 관리하며 app-config.xml에 있고, ContextSingletonBeanFactoryLocator은 다른 것을 생성합니다. 그들이 말하지 않으면 그들은 의사 소통을하지 않을 것입니다. EJB는 그 범위를 벗어나기 때문에 EJB는 웹 애플리케이션의 컨텍스트를 유지할 수 없습니다.

EJB에서 사용할 필요가있는 빈을 app-config.xml에서 다른 bean 정의 파일로 이동해야합니다. 이렇게 추출 된 bean 정의 세트는 (a) EJB가 액세스 할 수 있고 (b) 웹 애플리케이션 컨텍스트의 상위 컨텍스트로 작동하는 새로운 ApplicationContext의 기초를 형성합니다.

웹 응용 프로그램의 컨텍스트와 새 컨텍스트 사이에 부모 - 자식 링크를 활성화하려면 이라는 을 추가해야합니다. 이 매개 변수의 값은 beanRefContext.xml (예 : context)에 정의 된 컨텍스트의 이름이어야합니다.

웹 응용 프로그램의 컨텍스트에 남아있는 빈은 EJB처럼 부모 컨텍스트의 빈을 참조 할 수 있습니다. 그러나 EJB는 웹 애플리케이션의 컨텍스트에서 아무 것도 참조 할 수 없습니다.

또한, 그 클래스는 웹 애플리케이션에 대한 인식을 필요로하기 때문에 당신은 beanRefContext.xmlXmlWebApplicationContext를 사용할 수 있으며, ContextSingletonBeanFactoryLocator는 인식을 제공 할 수 없습니다. 거기에 ClassPathXmlApplicationContext을 붙여야합니다.

+0

결국 나는 그것을 완전히 잘못보고 있음을 깨달았습니다. 앱을 배포 할 때 애플리케이션 컨텍스트를 작성하는 대신 인터셉터가 호출 될 때 작성합니다. ContextSingletonBeanFactoryLocator가 웹 앱 컨텍스트를 찾을 수있을 것이라고 가정했지만 실제로는 싱글 톤으로 앱 컨텍스트를 만듭니다. 대답 주셔서 감사합니다, 스카프맨, 당신은 똑똑합니다 - 가상 요다처럼. – ravun

+3

@ravun : 필요한 컨텍스트를 연결하십시오. 예 – skaffman

관련 문제