私はREST APIに取り組んでいます。不適切な JSON (例: { sdfasdfasdf } ) を含む POST メッセージを受信すると、Spring は 400 Bad Request Error のデフォルト サーバー ページを返します。ページを返すのではなく、カスタムの JSON エラー オブジェクトを返します。
@ExceptionHandler を使用して例外がスローされた場合に、これを行うことができます。したがって、それが空白のリクエストまたは空白の JSON オブジェクト (例: { } ) である場合、NullPointerException がスローされ、ExceptionHandler でそれをキャッチして、好きなことを行うことができます。
問題は、それが無効な構文である場合、Spring が実際に例外をスローしないことです...少なくとも私が見ることはできません。Tomcat、Glassfish など、サーバーからデフォルトのエラー ページを返すだけです。
私の質問は、Spring を「インターセプト」して例外ハンドラーを使用させるか、エラー ページが表示されないようにして、代わりに JSON エラー オブジェクトを返すにはどうすればよいかということです。
これが私のコードです:
@RequestMapping(value = "/trackingNumbers", method = RequestMethod.POST, consumes = "application/json")
@ResponseBody
public ResponseEntity<String> setTrackingNumber(@RequestBody TrackingNumber trackingNumber) {
HttpStatus status = null;
ResponseStatus responseStatus = null;
String result = null;
ObjectMapper mapper = new ObjectMapper();
trackingNumbersService.setTrackingNumber(trackingNumber);
status = HttpStatus.CREATED;
result = trackingNumber.getCompany();
ResponseEntity<String> response = new ResponseEntity<String>(result, status);
return response;
}
@ExceptionHandler({NullPointerException.class, EOFException.class})
@ResponseBody
public ResponseEntity<String> resolveException()
{
HttpStatus status = null;
ResponseStatus responseStatus = null;
String result = null;
ObjectMapper mapper = new ObjectMapper();
responseStatus = new ResponseStatus("400", "That is not a valid form for a TrackingNumber object " +
"({\"company\":\"EXAMPLE\",\"pro_bill_id\":\"EXAMPLE123\",\"tracking_num\":\"EXAMPLE123\"})");
status = HttpStatus.BAD_REQUEST;
try {
result = mapper.writeValueAsString(responseStatus);
} catch (IOException e1) {
e1.printStackTrace();
}
ResponseEntity<String> response = new ResponseEntity<String>(result, status);
return response;
}