2010-10-22 74 views
0

我使用Struts2创建了一个应用程序,我希望有友好的URL。Struts 2上的动态URL

硅,我设置的struts.xml以下PARAMS:

<constant name="struts.action.extension" value=""/> 
<constant name="struts.enable.SlashesInActionNames" value="true"/> 
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/> 

和我的行动:

<package name="notes" namespace="/notes" extends="struts-default"> 
    <action name="/*/*" class="action.ViewNoteAction"> 
     <param name="title">{1}</param> 
     <param name="id">{2}</param> 
     <result>/Notes/view.jsp</result> 
    </action> 
</package> 

但是,当我打的网址http://localhost/notes/welcome/1我得到这个错误:

Servlet.service() for servlet default threw exception java.lang.NullPointerException

有什么想法吗?我做错了什么?我正在使用struts 2.0.14 ...谢谢。

以下是完整的堆栈跟踪:

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

感谢。 (而不是如*/*/*/*)

回答

2
  • 我不认为你需要的 斜线在你的动作名称
  • 你有没有在你的行动设置任何断点,看是否NPE发生在你的行动之前还是之后?
  • 你正在使用什么动作映射器?

另外,关于你只是试图获得Ruby on Rails样式友好URL的机会,你看看Struts2 Rest Plugin

编辑:正如我怀疑,这似乎与您的行动映射中的主要斜杠有关。我能够在Tomcat下重现这个异常。导致的斜线导致Struts2无法正确解析ActionConfig的动作,并正在生成NPE。将操作名称更改为*/*解决了问题并正确调用了带有欢迎标题和ID为1的ViewNotesAction。

+0

嗨,谢谢你的回复。我已经将完整的堆栈跟踪添加到问题中。另外,我会看看Struts2 Rest Plugin ...我是Struts2的新手,所以我不知道它。谢谢! – ilbesculpi 2010-10-26 17:22:25

+0

嘿,看看我更新的回复。它应该解决你的问题。 – 2010-10-26 21:58:38

+0

是的,这是史蒂文。我刚刚删除了主要的斜杠,它工作正常。再次感谢! :d – ilbesculpi 2010-10-27 03:42:16

0

如果您不想重新使用应用程序以直接使用Rest,那么也可以使用URL重写工具,如http://ocpsoft.com/prettyfaces/,它允许您直接在现有应用程序之上执行URL映射。

你只配置这样的事情在美丽的-config.xml文件:

<url-mapping> 
    <pattern value="/my/restful/url" /> 
    <view-id value="/my/existing/url" /> 
</url-mapping> 

或者,如果你想重写参数,你可以这样做:

<url-mapping> 
    <pattern value="/my/restful/url/#{param}" /> 
    <view-id value="/my/existing/url" /> 
</url-mapping> 

,这意味着任何看起来像/my/existing/url?param=value网址现在将变为:

/my/restful/url/value 

所以很容易添加Ø n到您当前的应用程序。