15

私は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;
}
4

1 に答える 1