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
值将发生相同的过程。
为了举例,我们假设我想创建一个 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
值将发生相同的过程。