在Spring MVC中,是否可以在一个请求处理程序方法中使用不同的返回类型?

时间:2011-01-04 17:52:01

标签: java spring spring-mvc

例如,如果请求成功,我将返回一个View,如果没有,则返回一个指示错误消息的String,并将content-type设置为xml或json。并且JavaScript XHR回调方法将完成重定向到另一个页面(View)或保持在同一页面并显示错误信息的工作。

根据我读到的内容,似乎我应该使用“void”作为处理程序方法的返回类型。看一下这个: “如果方法处理响应本身(通过直接写响应内容,声明一个 用于此目的的ServletResponse / HttpServletResponse类型的参数)或视图 name应该通过RequestToViewNameTranslator隐式确定(不是 在处理程序方法签名中声明响应参数。“(Spring Framework reference)。

我不明白的是“观点 name应该通过RequestToViewNameTranslator隐式确定(不是 在处理程序方法签名中声明响应参数)“意味着什么?有人给我一个例子吗?

3 个答案:

答案 0 :(得分:6)

更简洁的解决方案是让您的普通控制器方法在出错时抛出异常,然后使用@ExceptionHandler方法捕获它并返回错误响应。

@RequestMapping("/")
public View requestHandler() throws SomeException
{
  // ...
}

@ExceptionHandler(SomeException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public @ResponseBody String handleSomeException(SomeExcption ex)
{
  return ex.getMessage(); // for example
}

MappingJacksonHttpMessageConverter一起使用的@ResponseBody将无需直接访问HttpServletResponse以输出JSON。或者,使用MappingJacksonJsonViewModel。使用XML转换器/视图也可以完成相同的操作。

如果没有指定其他视图名称,RequestToViewNameTranslator将(如人们猜测的那样)将请求转换为视图名称。有关示例,请参阅DefaultRequestToViewNameTranslator

答案 1 :(得分:2)

在您的特殊情况下:

  • 如果一切正常 - 那么返回正常(jsp)视图
  • 如果发生错误 - 则打印错误页面

我会以更标准的方式做到这一点: 请求处理程序方法“返回”视图名称或模型和视图。 如果出现错误,则请求处理程序方法会抛出异常。 Spring提供了处理异常的功能,即特殊的视图处理程序。

答案 2 :(得分:0)

  

我不明白的是“视图名称应该通过RequestToViewNameTranslator隐式确定(不在处理程序方法签名中声明响应参数)”是什么意思?

引用关于Spring MVC的优秀文章:

  

一个有趣的案例是当方法未指定视图时发生的情况(例如,返回类型为void)。在这种情况下,约定是DispatcherServlet重用请求URI的路径信息,删除前导斜杠和扩展名。 [...]鉴于此请求处理方法和“/ accounts / show”的请求映射,我们可以预期DispatcherServlet将回退到默认视图名称“accounts / show”

还有一些例子。请参阅http://www.infoq.com/articles/spring-2.5-ii-spring-mvc,“灵活请求处理方法签名”一章