2016-11-29 64 views
2

我在Spring中構建了一個REST api,並且在處理異常時遇到了問題。我想驗證完整請求並一次性提供有關有效負載的信息。Spring jackson反序列化和異常處理

假設我的目標是

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。

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

如果我通過在此JSON

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

我想這樣

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

的響應。如果我這樣做,我得到一個

com.fasterxml。 jackson.databind.exc.InvalidFormatException

上BigDecimalField其中只包含有關只有一個字段的信息。我看到的唯一選擇是將其作爲字符串傳遞或編寫自定義驗證註釋。有沒有更簡單的方法來實現這一點?

+0

即使在準備好驗證之前,對象轉換仍然失敗。爲了實現你想要的東西,需要你的對象需要從你的json請求中成功創建 – ScanQR

回答

0

您可以爲此使用控制器建議。在你的應用程序中聲明一個控制器建議,捕獲你期望的異常,轉換爲你需要的響應並返回。請記住,控制器建議將應用於您的所有控制器。

@ControllerAdvice 
public class ExceptionHandlerController { 

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

     String yourResponse = ""; 
     return yourResponse; 
    } 

} 
+0

我目前的實現使用@ControllerAdvice來捕獲包含多個字段驗證錯誤的MethodArgumentNotValidException,而InvalidFormatException只包含關於一個字段的信息。我會更新我的問題以使其更清楚。 – jgeerts