/ / Contesto dell'applicazione Web Servlet dal filtro - molla, tomcat

Contesto dell'applicazione web servlet da filter - spring, tomcat

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 № 1

Ho 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!