Extensão Struts2 .action causando CSS, JavaScript e Struts Dojo para quebrar

Estamos rodando no Struts 2.1.8 há algum tempo e todas as ações do Struts estão funcionando como esperado, ou seja, as ações do href's para o Struts são renderizadas com o nome da ação sem extensão.

Aqui está o código JSP que define os links:

<ul id="top_menu">
  <li id="itemHome" class="active"><s:a action="viewHome">Home</s:a></li>
  <li><s:a action="viewSearch">Search</s:a></li>
  <li><s:a action="viewBookMarks">My Bookmarks</s:a></li>
  <li><s:a action="viewSupport">Support</s:a></li>
</ul>

Os links processados ​​corretamente parahttp://localhost/viewHome, http://localhost/viewSearch, etc. sob 2.1.8

Nós acabamos de fazer o upgrade para o Struts 2.2.1 (e já verificamos todas as versões deste até a v2.3.4.1) e agora vemos os links de ações do Struts sendo renderizados comohttp://localhost/viewHome.action, http://localhost/viewSearch.actionetc.

Minha pesquisa mostrou que a solução geral sugerida é usar

<constant name="struts.action.extension" value=""/>

em struts.xml para remover o sufixo .action. Embora isso faça com que as URLs sejam renderizadas corretamente, isso está causando um efeito colateral inesperado. O Struts agora acredita que cada URL é uma ação, incluindo solicitações de .css, .png etc.

Meu mapeamento de filtro no web.xml não foi alterado. E apesar de enviar / * para o Struts, nós não vimos esse comportamento em 2.1.8

<filter>
   <filter-name>struts2</filter-name>
   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>   
</filter>

<filter-mapping>
   <filter-name>struts2</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Para neutralizar isso eu tive que usar oexcludePattern para impedir que o Struts tente tratar essas solicitações como ações.

<constant name="struts.action.excludePattern" value="/index.html,/images/.*,/js/.*,/css/.*"/>

Enquanto isso funciona, o último obstáculo é que meus logs estão cheios de erros das solicitações de tags do Struts que estão sendo manipuladas como ações do Struts. Quando adiciono esses URIs ao padrão de exclusão, as tags do Struts Dojo não parecem estar funcionando em algumas páginas.

As partes do struts.xml afetadas são:

<constant name="struts.devMode" value="true" />
<!-- Set URL's to have no .action extension -->
<constant name="struts.action.extension" value=""/>
<constant name="struts.action.excludePattern" value="/index.html,/images/.*,/js/.*,/css/.*"/>

E um exemplo dos erros do Struts no log é:

2012-09-26 17:12:57,984 [http-bio-8080-exec-9] ERROR org.apache.struts2.dispatcher.Dispatcher- Could not find action or result
/struts/dojo/struts_dojo.js
There is no Action mapped for namespace [/] and action name [struts_dojo.js] associated with context path []. - [unknown location]
    at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)
    at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
    at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
    at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:501)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)

Não tenho certeza se as solicitações do Dojo do struts são URIs reais ou virtuais ou qualquer outra coisa.

Parece que eu pulei alguns arcos para consertar o que é essencialmente um simples problema de remover a extensão .action da URL, já que voltar ao 2.1.8 JAR resolve tudo, mas eu estou determinado a encontrar um caminho a seguir, se possível.

Qualquer ajuda é muito apreciada.

questionAnswers(1)

yourAnswerToTheQuestion