Spring无法解析servlet中的视图

时间:2011-05-17 15:37:54

标签: java spring

我已经为我的一个servlet添加了一个新的方法/映射:

@RequestMapping(value = "/user/prefs/order", method = RequestMethod.POST)
public void updateUsersPrefs(@RequestBody Map<String, ArrayList> body, HttpServletRequest request) {
    ...
}

但是当我向此网址发送请求时,我收到500内部服务器错误,并显示以下错误消息:

javax.servlet.ServletException: Could not resolve view with name 'user/prefs/order' in servlet with name 'appfinder'
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1029)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

我不能为我的生活看到为什么要报道这一点。有人能帮忙吗?我可以提供更多信息,请告诉我。

谢谢!

3 个答案:

答案 0 :(得分:31)

Spring使用@RequestMapping返回类型in the following manner处理void方法:

  

void - 如果方法处理响应本身(通过直接编写响应内容,为此目的声明类型为ServletResponse / HttpServletResponse的参数或者,如果视图名称应该通过RequestToViewNameTranslator隐式确定(不在处理程序方法签名中声明响应参数)。

因此,由于此方法没有HttpServletResponse参数,因此Spring假定您希望通过RequestToViewNameTranslator确定视图名称。

如果您未在上下文中指定要使用的特定RequestToViewNameTranslator,则the default implementation kicks in which will

  

只是将传入请求的URI转换为视图名称。

如果您不希望将传入请求的URI用作视图名称,则可以选择以下几个选项:

  1. 使用您想要的行为配置自定义RequestToViewNameTranslator
  2. 如果您想直接写入响应而不是查看解析,请在此方法中添加HttpServletResponse参数。
  3. 将此方法的返回类型更改为StringView, or ModelAndView`,以便能够在方法中指定视图或视图名称。

答案 1 :(得分:4)

我遇到了这个问题,原因是我使用的是tile框架,并没有在tiles-def.xml中提及视图名称。配置完tile-def.xml后问题就解决了。

答案 2 :(得分:2)

我也有这个问题。 我使用@ResponseBody注释解决了它。

像这样:

@RequestMapping(value = "/user/prefs/order", method = RequestMethod.POST)
@ResponseBody
public void updateUsersPrefs(@RequestBody Map<String, ArrayList> body, HttpServletRequest request) {
    ...
}