URLs dinâmicas no Struts 2

Estou criando um aplicativo usando o Struts2 e quero ter URLs amigáveis.

Si, eu defino os seguintes parâmetros em struts.xml:

   

e minhas ações:

   {1} {2} /Notes/view.jsp   

Mas, quando eu acessei a URL http: // localhost / notes / welcome / 1 eu recebi este erro:

Servlet.service () para servlet padrão lançou exceção java.lang.NullPointerException

qualquer ideia? O que estou fazendo errado? Estou usando struts 2.0.14 … Obrigado.

Aqui está o rastreio da pilha completa:

ATENÇÃO: StandardWrapperValve [padrão]: PWC1406: O servlet.service () para o servlet padrão lançou a exceção java.lang.NullPointerException em com.opensymphony.xwork2.config.impl.ActionConfigMatcher.convertActionConfig (ActionConfigMatcher.java:168) em com.opensymphony. xwork2.config.impl.ActionConfigMatcher.match (ActionConfigMatcher.java:144) em com.opensymphony.xwork2.config.impl.DefaultConfiguration $ RuntimeConfigurationImpl.getActionConfig (DefaultConfiguration.java:297) em com.opensymphony.xwork2.DefaultActionProxy.prepare ( DefaultActionProxy.java:169) em org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy (StrutsActionProxyFactory.java:41) em org.apache.struts2.dispatcher.Dispatcher.serviceAction (Dispatcher.java:494) em org.apache.struts2 .dispatcher.FilterDispatcher.doFilter (FilterDispatcher.java:422) em org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:256) em org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilter Chain.java:215) em org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:277) em org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:188) em org.apache.catalina .core.StandardPipeline.invoke (StandardPipeline.java:641) em com.sun.enterprise.web.WebPipeline.invoke (WebPipeline.java:97) em com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke (PESessionLockingStandardPipeline.java:85 ) em org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:185) em org.apache.catalina.connector.CoyoteAdapter.doService (CoyoteAdapter.java:332) em org.apache.catalina.connector.CoyoteAdapter. service (CoyoteAdapter.java:233) em com.sun.enterprise.v3.services.impl.ContainerMapper.service (ContainerMapper.java:165) em com.sun.grizzly.http.ProcessorTask.invokeAdapter (ProcessorTask.java:791) em com.sun.grizzly.http.ProcessorTask.doProcess (ProcessorTask.java:693) em com.sun.grizzly.http.ProcessorTask.process (ProcessorTask.java:954) at com.su n.grizzly.http.DefaultProtocolFilter.execute (DefaultProtocolFilter.java:170) em com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter (DefaultProtocolChain.java:135) em com.sun.grizzly.DefaultProtocolChain.execute (DefaultProtocolChain.java:102) em com.sun.grizzly.DefaultProtocolChain.execute (DefaultProtocolChain.java:88) em com.sun.grizzly.http.HttpProtocolChain.execute (HttpProtocolChain.java:76) em com.sun.grizzly.ProtocolChainContextTask.doCall (ProtocolChainContextTask.java : 53) em com.sun.grizzly.SelectionKeyContextTask.call (SelectionKeyContextTask.java:57) em com.sun.grizzly.ContextTask.run (ContextTask.java:69) em com.sun.grizzly.util.AbstractThreadPool $ Worker. doWork (AbstractThreadPool.java:330) em com.sun.grizzly.util.AbstractThreadPool $ Worker.run (AbstractThreadPool.java:309) em java.lang.Thread.run (Thread.java:637)

Obrigado.

  • Eu não acho que você precisa da barra inicial em seu nome de ação (por exemplo, * / * em vez de / * / *)
  • Você definiu algum ponto de interrupção em sua ação para ver se o NPE está ocorrendo antes ou depois de sua ação?
  • Qual mapeador de ações você está usando?

Além disso, se você estiver apenas tentando obter URLs amigáveis ​​do estilo Ruby on Rails, você examinou o Plugin de Restrição do Struts2 ?

Edit: Como eu suspeitava, isso parece estar relacionado à barra principal no seu mapeamento de ação. Consegui reproduzir essa exceção no Tomcat. A barra principal está fazendo com que o Struts2 não consiga analisar adequadamente o ActionConfig para essa ação e está produzindo o NPE. Alterar o nome da ação para * / * resolveu o problema e invocou corretamente o ViewNotesAction com um título de boas-vindas e um id de 1.

Se você não quiser voltar a trabalhar com seu aplicativo para usar Rest, você também pode usar ferramentas de regravação de URL como http://ocpsoft.com/prettyfaces/ , que permite fazer mapeamentos de URL diretamente sobre uma aplicação existente.

Você acabou de configurar algo assim no arquivo pretty-config.xml:

     

Ou se você quiser rewrite parâmetros, você pode fazer isso:

     

E isso significa que qualquer URL com aparência de /my/existing/url?param=value será agora:

 /my/restful/url/value 

Por isso, é fácil adicionar aos seus aplicativos atuais.

    Intereting Posts