仅仅为了举例,我们假设我想创建一个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。
答案 0 :(得分:4)
在ResponseEntity
的情况下,Spring MVC不关心参数化返回类型,它只关心值。
您可以简单地提供
public ResponseEntity<?> getMotd(@RequestParam(value = "day") int day {
Spring MVC&#39; s HttpEntityMethodProcessor
,它处理类型为ResponseEntity
的处理程序方法返回的值,将检索body
的{{1}}和委托写入对适当ResponseEntity
的回复。
与HttpMessageConverter
值相同的Motd
值也会发生同样的过程。