2017-08-03 126 views
1

我想驗證我的Spring @RestController中端點的@RequestBody。因此,我創建這樣的方法:Bean驗證 - 如何自定義ConstraintViolationException?

@RequestMapping(value = ...) 
public ResponseEntity<...> myPostMethod(@RequestBody MyBean myBean) throws Exception { 

MyBean裝飾有一個自定義@Constraint及其相應的驗證邏輯上我創建了一個ConstraintValidator類實現。該驗證器具有如下方法:

@Override 
public boolean isValid(MyBean value, ConstraintValidatorContext context) { 

這就是所有驗證邏輯發生的地方。當它失敗時,isValid返回false,我可以使用該參數以我想要的方式生成驗證錯誤消息。另外,myPostMethod也會自動失敗(因爲我不會自己拋出它)MethodArgumentNotValidException,我將在全局處理程序上捕獲以呈現通用ResponseEntity。這一切都按預期工作。 現在的問題是:我如何定製不僅驗證錯誤消息,而且整個ConstraintViolationException?我想在異常中提供更多的數據(來自我的業務領域),以便在響應正文json中呈現。

任何提示將不勝感激。

回答

1

我找到了答案:

https://docs.jboss.org/hibernate/validator/5.4/api/org/hibernate/validator/constraintvalidation/HibernateConstraintValidatorContext.html#withDynamicPayload-java.lang.Object-

public boolean isValid(MyBean value, ConstraintValidatorContext constraintValidatorContext) { 
    HibernateConstraintValidatorContext context = constraintValidatorContext.unwrap(HibernateConstraintValidatorContext.class); 

    // (...) 

    context.buildConstraintViolationWithTemplate("{foo}") 
     .withDynamicPayload(anyAdditionalInfo) 
     .addConstraintViolation(); 

    return false; 
}