ExceptionHandler 可以返回 ModelAndView、Model、Map 等。是否可以返回我自己类型的对象并注册一些转换器,可以将我的类型转换为 Spring 可以理解的类型之一?例如:
@ExceptionHandler
public MyType handle(Exception e) {
...
}
@SomeTransformer
public Map convert(MyType myObject) {
...
}
最佳答案
ExceptionHandler 方法遵循与 Controller 方法相同的约定。 Here's Spring 3.1 中 Spring MVC Controller 方法所有支持的返回类型的列表。您最感兴趣的是项目符号 #7。
相关部分:
16.3.3.2 Supported method return types
以下是支持的返回类型:
一个 ModelAndView 对象,其中模型隐式地通过命令对象和 @ModelAttribute 注释的引用数据访问器方法的结果进行了丰富。
模型对象,其 View 名称通过 RequestToViewNameTranslator 隐式确定,模型隐式地使用命令对象和 @ModelAttribute 注释的引用数据访问器方法的结果进行丰富。
用于公开模型的 Map 对象,通过 RequestToViewNameTranslator 隐式确定 View 名称,并使用命令对象和 @ModelAttribute 注释的引用数据访问器方法的结果隐式丰富模型。
一个 View 对象,其模型通过命令对象和 @ModelAttribute 注释的引用数据访问器方法隐式确定。处理程序方法还可以通过声明模型参数以编程方式丰富模型(参见上文)。
一个字符串值,被解释为逻辑 View 名称,模型通过命令对象和 @ModelAttribute 注释的引用数据访问器方法隐式确定。处理程序方法还可以通过声明模型参数以编程方式丰富模型(参见上文)。
如果方法本身处理响应(通过直接写入响应内容,为此目的声明 ServletResponse/HttpServletResponse 类型的参数),或者如果 View 名称应该通过 RequestToViewNameTranslator 隐式确定(不是在处理程序方法签名中声明响应参数)。
如果该方法使用 @ResponseBody 注解,则返回类型将写入响应 HTTP 正文。返回值将使用 HttpMessageConverters 转换为声明的方法参数类型。请参阅第 16.3.3.5 节“使用 @ResponseBody 注释映射响应正文”。
一个 HttpEntity 或 ResponseEntity 对象,用于提供对 Servlet 响应 HTTP header 和内容的访问。实体主体将使用 HttpMessageConverters 转换为响应流。请参阅第 16.3.3.6 节“使用 HttpEntity”。
任何其他返回类型都被视为要公开给 View 的单个模型属性,使用在方法级别通过 @ModelAttribute 指定的属性名称(或基于返回类型类名称的默认属性名称)。该模型通过命令对象和 @ModelAttribute 注释的引用数据访问器方法的结果隐式丰富。
关于java - spring mvc 中的任意返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530735/