例として、今日のメッセージ (motd) を返す REST エンドポイントを作成するとします。着信パラメーターは数値で表される日であり、結果は日とメッセージを含む 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 に基づいています。