2016-11-29 9 views
2

私はSpringでREST APIを構築しています。私は例外処理に問題があります。私は完全な要求を検証し、ペイロードに関する情報を一度に伝えたいと思います。スプリングジャーンソンの非直列化と例外処理

私のオブジェクトが

public class StubJson { 
    private BigDecimal bigDecimalField; 
    @NotEmpty 
    private String stringField; 

    public void setBigDecimalField(BigDecimal bigDecimalField) { this.bigDecimalField = bigDecimalField; } 
    public String setStringField(String stringField) { this.stringField = stringField; } 
} 

ですそして、私のコントローラは

@RestController 
public class StubController { 
    @RequestMapping(value = "/stub", method = POST) 
    public void stub(@Valid @RequestBody StubJson stubJson) {} 
} 

あるこのオブジェクトの検証は、エンドユーザーのための翻訳エラーにFieldErrorオブジェクトを変換@ControllerAdviceである。仮定私はこのJSON

{"bigDecimalField": "text", "stringField": ""} 

に渡すと、私はこれを行う場合は

@ResponseStatus(BAD_REQUEST) 
@ResponseBody 
@ExceptionHandler(value = MethodArgumentNotValidException.class) 
public List<ErrorJson> processValidationError(MethodArgumentNotValidException ex) {} 

は私が

com.fasterxmlを取得し、この

[ 
    { 
    "field": "stringField", 
    "message": "Cannot be empty." 
    }, 
    { 
    "field": "bigDecimalField", 
    "message": "Not a number." 
    } 
] 

のような応答をしたいです。 jackson.databind.exc.InvalidFormatException

は、の情報のみを含むBigDecimalFieldにあります。フィールド。私が見る唯一のオプションは、文字列として渡すか、カスタム検証アノテーションを記述することです。これを達成する簡単な方法はありますか?

+0

オブジェクトの変換は、検証準備が整う前でも失敗しています。 – ScanQR

答えて

0

コントローラのアドバイスをこの目的で使用できます。あなたのアプリケーションでコントローラのアドバイスを宣言し、予期される例外を捕まえ、必要な応答に変換して返します。コントローラのアドバイスがすべてのコントローラに適用されることを覚えておいてください。

@ControllerAdvice 
public class ExceptionHandlerController { 

@ExceptionHandler(InvalidFormatException.class) 
    @ResponseBody public String typeMismatchException(HttpServletRequest request, HttpServletResponse servletResponse, InvalidFormatException e) { 

     String yourResponse = ""; 
     return yourResponse; 
    } 

} 
+0

私の現在の実装では、このInvalidFormatExceptionには1つのフィールドに関する情報しか含まれていないが、複数のフィールドに関する検証エラーを含むMethodArgumentNotValidExceptionをキャッチする@ControllerAdviceが使用されています。より明確にするために質問を更新します。 – jgeerts

関連する問題