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