【问题标题】:arbitrary return types in spring mvcspring mvc中的任意返回类型
【发布时间】:2013-03-20 17:33:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring spring-mvc return-type


    【解决方案1】:

    ExceptionHandler 方法遵循与 Controller 方法相同的约定。 Here's Spring 3.1 中 Spring MVC 控制器方法支持的所有返回类型的列表。项目符号 #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 注释映射响应正文”。

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • +1 表示好主意。如果应用程序计划足够大,方面可能是最干净的方式
      猜你喜欢
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      相关资源
      最近更新 更多