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

时间:2015-10-28 21:45:05

标签: spring spring-mvc spring-boot spring-restcontroller spring-rest

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

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

这被翻译成......

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

...并且由此代码返回:

@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);
}

这一切正常,只要一切都好,但我的目的是返回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。 是否有任何替代品/更优雅的替代品,允许春天回归&#34;变化&#34;课程?

我的问题的重点不在于错误处理,例如,我向我展示了一些聪明的方法based on exceptions。如果可能的话,我想避免从公共基类派生所有可能返回的类。

我的代码基于Spring Boot 1.3 RC1。

1 个答案:

答案 0 :(得分:4)

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

您可以简单地提供

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

Spring MVC&#39; s HttpEntityMethodProcessor,它处理类型为ResponseEntity的处理程序方法返回的值,将检索body的{​​{1}}和委托写入对适当ResponseEntity的回复。

HttpMessageConverter值相同的Motd值也会发生同样的过程。