Provo a ottenere il contesto dell'applicazione web di primavera da un filtro.
In precedenza lo stavo superando:
WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext())
Era ok, perché stavo ottenendo quello che viene chiamato penso che il contesto dell'applicazione web ROOT. Ora, volevo spostare tutta la mia definizione di primavera come quella in web.xml:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext instead of default XmlWebApplicationContext. -->
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<!-- Custom web configuration annotated class. -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>foo.bar.WebConfiguration</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Ho rimosso la "vecchia" definizione da web.xml:
<!-- <context-param> -->
<!-- <param-name>contextConfigLocation</param-name> -->
<!-- <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> -->
<!-- </context-param> -->
<!-- <listener> -->
<!-- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> -->
<!-- </listener> -->
Ora, non ho più il contesto dell'applicazione Web "ROOT" e il filtro non può ottenere il contesto di un'altra applicazione web.
Ho visto che c'è un'altra chiamata:
WebApplicationContextUtils.getWebApplicationContext(sc, attrName)
consente di specificare come secondo argomento l '"attributo", è in effetti il contesto dell'applicazione Web desiderato. Per impostazione predefinita, è "org.springframework.web.context.WebApplicationContext.ROOT".
Penso di dover chiamare questo metodo ma non so cosa mettere come secondo parametro.
PS: Ho anche provato a utilizzare org.springframework.web.filter.DelegatingFilterProxy, ma Tomcat ha generato l'errore che non trova il classico contesto dell'applicazione Web (ROOT):
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
MA C'È UN ALTRO CONTESTO, è appena definito in un altro modo. Non è possibile che io sia l'unico a cercare di ottenere un altro contesto che il ROOT.
Grazie per aver letto finora.
risposte:
0 per risposta № 1Ho appena letto la tua risposta, e sì, l'ho capito ieri sera ;-) Ho aggiunto il contesto ROOT, definendolo così:
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>foo.bar.WebConfiguration</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
E funzionando, il filtro può accedere al servizio direttamente con Autowiring.
Ho ancora la sensazione che la mia architettura siasporca perché la radice e il contesto "dispatcher" sono la stessa cosa, penso che "non è una buona pratica. Forse io "Cercherò poi di dividere il 'CONFIGURAZIONEWEB' in due.
Grazie lo stesso!