ExceptionHandler可以返回ModelAndView,Model,Map等。是否可以返回我自己类型的对象并注册一些可以将我的类型转换为Spring所理解的类型之一的转换器?例如:
@ExceptionHandler
public MyType handle(Exception e) {
...
}
@SomeTransformer
public Map convert(MyType myObject) {
...
}
答案 0 :(得分:1)
ExceptionHandler方法遵循与Controller方法相同的合同。 Here's Spring 3.1中Spring MVC控制器方法的所有支持的返回类型的列表。子弹#7对你来说是最感兴趣的。
相关部分:
16.3.3.2支持的方法返回类型
以下是支持的返回类型:
一个ModelAndView对象,该模型隐式丰富了命令对象和@ModelAttribute带注释的引用数据访问器方法的结果。
一个Model对象,其视图名称通过RequestToViewNameTranslator隐式确定,并且模型隐式地使用命令对象和@ModelAttribute注释的引用数据访问器方法的结果。
用于公开模型的Map对象,其中视图名称通过RequestToViewNameTranslator隐式确定,模型隐式地使用命令对象和@ModelAttribute注释引用数据访问器方法的结果。
一个View对象,该模型通过命令对象和@ModelAttribute注释的引用数据访问器方法隐式确定。处理程序方法还可以通过声明Model参数(参见上文)以编程方式丰富模型。
一个String值,被解释为逻辑视图名称,模型通过命令对象和@ModelAttribute注释的引用数据访问器方法隐式确定。处理程序方法还可以通过声明Model参数(参见上文)以编程方式丰富模型。
如果方法处理响应本身(通过直接编写响应内容,为此目的声明类型为ServletResponse / HttpServletResponse的参数)或者是否应该通过RequestToViewNameTranslator隐式确定视图名称(无在处理程序方法签名中声明响应参数。
如果使用@ResponseBody注释该方法,则会将返回类型写入响应HTTP正文。返回值将使用HttpMessageConverters转换为声明的方法参数类型。请参见第16.3.3.5节“使用@ResponseBody注释映射响应正文”。
HttpEntity或ResponseEntity对象,用于提供对Servlet响应HTTP标头和内容的访问。使用HttpMessageConverters将实体主体转换为响应流。请参见第16.3.3.6节“使用HttpEntity”。
任何其他返回类型都被视为要暴露给视图的单个模型属性,使用在方法级别通过@ModelAttribute指定的属性名称(或基于返回类型类名称的默认属性名称)。该模型隐含地丰富了命令对象和@ModelAttribute注释引用数据访问器方法的结果。
答案 1 :(得分:1)
当然,你也可以在建议后使用aspectj
做你想做的事。
private pointcut transformer() : execution(@SomeTransformer * *(..));
after() returning (Object o): transformer() {
System.out.println("I'd like to transform this object " + o);
}
但是......我不知道你为什么要这么做..?
免责声明:这是未经测试的。