1

ExceptionHandler 可以返回 ModelAndView、Model、Map 等。是否可以返回我自己类型的对象并注册一些可以将我的类型转换为 Spring 理解的类型之一的转换器?例如:

@ExceptionHandler
public MyType handle(Exception e) {
  ...
}

@SomeTransformer
public Map convert(MyType myObject) {
   ...
}
4

2 回答 2

1

ExceptionHandler 方法遵循与 Controller 方法相同的约定。 这是Spring 3.1 中 Spring MVC 控制器方法支持的所有返回类型的列表。Bullet #7 将是您最感兴趣的。

相关部分:

16.3.3.2 支持的方法返回类型

以下是支持的返回类型:

  • 一个 ModelAndView 对象,模型隐含地丰富了命令对象和 @ModelAttribute 注释的引用数据访问器方法的结果。

  • 一个模型对象,视图名称通过 RequestToViewNameTranslator 隐式确定,模型隐式地丰富了命令对象和 @ModelAttribute 注释的引用数据访问器方法的结果。

  • 用于公开模型的 Map 对象,视图名称通过 RequestToViewNameTranslator 隐式确定,模型隐式地丰富了命令对象和 @ModelAttribute 注释的引用数据访问器方法的结果。

  • 一个 View 对象,模型通过命令对象和 @ModelAttribute 注释的引用数据访问器方法隐式确定。处理程序方法还可以通过声明模型参数以编程方式丰富模型(见上文)。

  • 一个字符串值,被解释为逻辑视图名称,模型通过命令对象和 @ModelAttribute 注释的引用数据访问器方法隐式确定。处理程序方法还可以通过声明模型参数以编程方式丰富模型(见上文)。

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

  • 如果该方法使用 @ResponseBody 注释,则返回类型将写入响应 HTTP 正文。返回值将使用 HttpMessageConverters 转换为声明的方法参数类型。请参阅第 16.3.3.5 节,“使用 @ResponseBody 注释映射响应正文”。

  • 一个 HttpEntity 或 ResponseEntity 对象,用于提供对 Servlet 响应 HTTP 标头和内容的访问。实体主体将使用 HttpMessageConverters 转换为响应流。请参阅第 16.3.3.6 节,“使用 HttpEntity”。

任何其他返回类型都被认为是要暴露给视图的单个模型属性,使用通过 @ModelAttribute 在方法级别指定的属性名称(或基于返回类型类名称的默认属性名称)。该模型隐含地丰富了命令对象和 @ModelAttribute 注释的引用数据访问器方法的结果。

于 2013-03-20T17:37:09.873 回答
1

当然,您也可以使用aspectj事后建议来做您想做的事。

private pointcut transformer() : execution(@SomeTransformer * *(..));

after() returning (Object o): transformer() {
      System.out.println("I'd like to transform this object " + o);
}

但是..我不知道你为什么要那样做..?

免责声明:这是未经测试的。

于 2013-03-20T20:57:22.917 回答