1

仅出于示例的目的,假设我想创建一个 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。是否有任何替代方案/更优雅的替代方案允许 Spring 返回“变化”类?

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

我的代码基于 Spring Boot 1.3 RC1。

4

1 回答 1

4

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

您可以简单地提供

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

Spring MVCHttpEntityMethodProcessor处理由处理程序方法返回的类型为 的值ResponseEntity,将检索 的body并将ResponseEntity写入委托给适当的响应HttpMessageConverter

值会发生与Motd值相同的过程Status

于 2015-10-29T04:47:22.320 回答