spring 2.5 jstl查看错误

Ale*_*x D 3 java spring frameworks

我有以下控制器


@Controller
@RequestMapping("/project/view.html")
public class ProjectViewController {

 private static final String viewName = "projectView";


 @RequestMapping(method = RequestMethod.GET)
 public String showPage(Model model,
   @RequestParam(value="id",required=false) Long id) {

  //code.....

  return viewName;
 }

}
Run Code Online (Sandbox Code Playgroud)

我的views.properties包含


projectView.(class)=org.springframework.web.servlet.view.JstlView
projectView.url=/WEB-INF/jsp/project/view.jsp
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.

但我需要更改方法以返回View(),因为如果出现故障,我必须将RedirectView()返回到某个错误页面.所以我把方法改为:


@Controller
@RequestMapping("/project/view.html")
public class ProjectViewController {

 private static final String viewName = "projectView";


 @RequestMapping(method = RequestMethod.GET)
 public View showPage(Model model,
   @RequestParam(value="id",required=false) Long id) {

  //code.....

  return new JstlView(viewName);
 }

}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我得到一个NPE:


java.lang.NullPointerException
 at org.springframework.web.context.support.WebApplicationObjectSupport.getServletContext(WebApplicationObjectSupport.java:121)
 at org.springframework.web.servlet.view.JstlView.exposeHelpers(JstlView.java:133)
 at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
 at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:257)
 at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1183)
 at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:902)
 at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
 at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
 at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
 at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)

我已经调试了,似乎getWebApplicationContext()返回null.

任何帮助赞赏.

谢谢.

ska*_*man 5

异常的原因是JstlView需要在使用之前注入某些事物,例如当前事件WebApplicationContext.通常,这对您来说是透明的,因为Spring实例化并JstlView为您做好准备.只有当你自己做,你才能看到所涉及的内容.

现在,你可以调用你实例化setApplicationContextJstlView那个,但你不希望你的控制器参与到那种事情中.你真的想让Spring继续工作.

现在,既然您正在使用views.properties,那么您也可以使用它ResourceBundleViewResolver来解决您的观点.这里的关键是要认识到,春天可以处理多个在同样的情况下视图解析器,它会简单地问他们一个接一个,直到其中一个解决视图名称.

所以我的建议是另一种解析器添加到您的背景下,这一时间InternalResourceViewResolver(这实际上是默认的解析器,但是当你指定你是默认被抑制ResourceBundleViewResolver).

现在,当您返回ResourceBundleViewResolver无法解析的视图名称时,InternalResourceViewResolver将查询.

InternalResourceViewResolver只需将视图名称作为实际的JSP路径(例如/WEB-INF/page.jsp直接从控制器方法返回).它还允许您使用类似的语法redirect:/path/to/my/url.

所以,你的其他控制器可以继续按规定在返回视图名称views.properties,但现在除了可以返回动态组装redirect:x/y/视图名称,这将是被翻译InternalResourceViewResolverRedirectView.无需自己构建这些视图.

最后要注意的一点是:视图解析器按照它们出现在beans文件中的顺序进行查询,并且InternalResourceViewResolver 必须在该列表中排在最后.