/ / Contexto de aplicativo da Web de servlet do filtro - primavera, tomcat

Contexto de aplicativo da Web de servlet do filtro - primavera, tomcat

Eu tento obter o contexto de aplicativo da web de mola de um filtro.

Eu já estava passando por isso:

WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext())

Foi ok, porque eu estava recebendo o que é chamado eu acho que o contexto da aplicação web ROOT. Agora, eu queria mover toda a minha definição de primavera assim no 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>

Eu removi a definição "antiga" do 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> -->

Agora, não tenho mais contexto de aplicativo da Web "ROOT" e o filtro não pode obter o contexto de outro aplicativo da web.

Eu vi que há outra ligação:

WebApplicationContextUtils.getWebApplicationContext(sc, attrName)

ele permite especificar como segundo argumento o "atributo", é na verdade o contexto da aplicação web que você deseja. Por padrão, é "org.springframework.web.context.WebApplicationContext.ROOT".

Eu acho que tenho que chamar esse método, mas eu não sei o que colocar como segundo parâmetro.

PS: Eu também tentei usar org.springframework.web.filter.DelegatingFilterProxy, mas o tomcat lançou o erro de não encontrar o contexto da aplicação web clássica (ROOT):

java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?

MAS HÁ OUTRO CONTEXTO, é apenas definido de outra maneira. Não é possível eu sou o único tentando obter outro contexto que a raiz.

Obrigado por ter lido até agora.

Respostas:

0 para resposta № 1

Acabei de ler sua resposta, e sim, eu percebi ontem à noite ;-) Eu adicionei o contexto ROOT, definindo assim:

    <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 seu trabalho, o filtro pode aceder ao serviço diretamente com Autowiring.

Eu ainda tenho a sensação de que minha arquitetura ésujo porque o contexto ROOT e "dispatcher" são os mesmos, eu acho que não é uma boa prática. Talvez eu tente mais tarde dividir o "WebConfiguration" em dois.

Obrigado mesmo assim!