Wstrzyknąć fasolkę wiosenną do EJB3

Próbuję wstrzyknąć fasolę wiosenną do EJB za pomocą @Interceptors(SpringBeanAutowiringInterceptor.class), ale nie mogę go uruchomić z przykładami beanRefContext.xml, które widziałem.

Oto mój EJB:

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

    @Autowired
    private SomeBean bean;
}

Podałem beanrefkontekst.xml w następujący sposób:

<?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>

Ale wydaje się, że odtwarzanie fasoli zamiast uzyskiwania istniejącego ApplicationContext. Kończę z następującym wyjątkiem, ponieważ jednym z moich fasoli jest ServletContextAware.

java.lang.IllegalArgumentException: Cannot resolve ServletContextResource
without ServletContext

Podczas korzystania z SpringBeanAutowiringInterceptor, czy nie powinien on uzyskać ApplicationContext zamiast utworzyć nowy?

Próbowałem też zmienić moją sieć.xml, więc contextConfigLocation wskazuje na beanRefContext.xml, mając nadzieję, że załaduje mój Spring config, ale kończę z tym samym wyjątkiem, co powyżej.

Czy ktoś wie jak to zrobić właściwie? Przykłady, które widziałem wydają się używać tej samej metody, której używam, co zakładam, że oznacza, że ziarna są odtwarzane, gdy Interceptor jest wywoływany (lub jest to, jak to ma działać i mam niezrozumiany).
Author: ravun, 2011-03-09

1 answers

Podczas korzystania z SpringBeanAutowiringInterceptor, nie powinien on uzyskać ApplicationContext zamiast utworzyć nowy?

Tak, i to właśnie robi. Używa mechanizmu ContextSingletonBeanFactoryLocator, który z kolei zarządza wieloma instancjami ApplicationContext jako statyczne singletony (tak, nawet Spring musi czasami uciekać się do statycznych singletonów). Te konteksty są zdefiniowane w beanRefContext.xml.

Twoje zamieszanie wydaje się wynikać z oczekiwania, że te konteksty mają jakikolwiek związek z Twoją webapp ApplicationContext - nie, są całkowicie oddzielne. Tak więc ContextLoader jest tworzenie i zarządzanie kontekstem na podstawie definicji bean w app-config.xml, a ContextSingletonBeanFactoryLocator tworzy kolejny. Nie będą się komunikować, dopóki im nie powiesz. EJB nie może zdobyć kontekstu webapp, ponieważ EJB siedzieć poza tym zakresie.

To, co musisz zrobić, to przenieść ziarna, które muszą być używane przez Twój EJBs z app-config.xml i do innego pliku definicji fasoli. Ten wyodrębniony zbiór definicji fasoli będzie stanowił podstawę Nowy ApplicationContext, Który (a) będzie dostępny przez EJBs i (b) będzie działać jako kontekst nadrzędny kontekstu Twojej aplikacji webapp.

Aby aktywować łącze rodzic-dziecko między kontekstem webapp a nowym kontekstem, musisz dodać dodatkowe <context-param> do swojego web.xml o nazwie parentContextKey. Wartość tego parametru powinna być nazwą kontekstu zdefiniowanego w beanRefContext.xml (tj. context, w twoim przykładzie).

Ziarna, które pozostają w tyle w kontekście webapp będzie w stanie odwołać się do fasola w kontekście rodzica, podobnie jak EJB. Jednak EJBs nie będzie w stanie odwołać się do niczego w kontekście webapp.

Również, nie można używać XmlWebApplicationContext w beanRefContext.xml, ponieważ ta klasa wymaga świadomości webapp, i {[2] } nie może dostarczyć tej świadomości. Powinieneś trzymać się ClassPathXmlApplicationContext tam.

 11
Author: skaffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-10 12:49:12