Spring MVC:让 RestController 序列化不同的 类 到 JSON

Spring MVC: let RestController serialize different classes to JSON

为了举例,我们假设我想创建一个 REST 端点,它 return 是当天的消息 (motd)。传入参数是用数字表示的日期,结果是 JSON 包含日期和消息。

public class Motd {
  int day;
  String message;
  ...
}

这被翻译成...

{ 
  "day": 1,
  "message": "whatever you want to say here"
}

... 并且 return 由以下代码编辑:

@RequestMapping(value = "/motd", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<Motd> getMotd(@RequestParam(value = "day") int day {
    ...
    return new ResponseEntity<Motd>(motd, HttpStatus.OK);
}

只要一切正常,这就可以正常工作,但我的目的是 return http 状态代码和 JSON 解释可能发生的任何错误的原因:

...
if( day > 365 ) {
    Status error = new Status( "failed", "can't go beyond 365 days" );
    return new ResponseEntity<Status>(error, HttpStatus.BAD_REQUEST);
}
...

但这与前面定义的ResponseEntity<Motd>冲突。到目前为止我知道的唯一解决方案是自己定义 ResponseEntity<String> 并序列化 JSON 。 是否有任何替代方案/更优雅的替代方案允许 Spring return "varying" classes ?

我的问题的重点不是错误处理,例如,有人向我展示了一些聪明的方法来做到这一点 based on exceptions。如果可能的话,我想避免从一个公共基础 class.

派生所有可能的 returned classes

我的代码基于Spring Boot 1.3 RC1.

ResponseEntity的情况下,Spring MVC不关心参数化的return类型,它只关心值。

您只需提供

public ResponseEntity<?> getMotd(@RequestParam(value = "day") int day {

Spring MVC 的 HttpEntityMethodProcessor,它处理由类型为 ResponseEntity 的处理程序方法编辑的值 return,将检索 body ResponseEntity 并委托写入对适当 HttpMessageConverter 的响应。

Motd 值和 Status 值将发生相同的过程。