2014-07-17 74 views
5

我創建使用Bean驗證1.2以下方法一個Spring MVC的REST服務:春Bean驗證@Valid處理

@RequestMapping(value = "/valid") 
public String validatedMethod(@Valid ValidObject object) { 

} 

如果對象是無效的,Tomcat的告訴我,The request sent by the client was syntactically incorrect.和我validatedMethod是永遠調用。

如何獲取在ValidObject bean中定義的消息?我應該使用一些過濾器還是攔截器?

我知道我可以重寫下面一樣,得到一套由注入ValidatorConstraintViolation S,但上面似乎更利落......

@RequestMapping(value = "/valid") 
public String validatedMethod(ValidObject object) { 
    Set<ConstraintViolation<ValidObject>> constraintViolations = validator 
      .validate(object); 
    if (constraintViolations.isEmpty()) { 
     return "valid"; 
    } else { 
     final StringBuilder message = new StringBuilder(); 
     constraintViolations.forEach((action) -> { 
      message.append(action.getPropertyPath()); 
      message.append(": "); 
      message.append(action.getMessage()); 
     }); 
     return message.toString(); 
    } 
} 

回答

4

試試這個

@RequestMapping(value = "/valid") 
public String validatedMethod(@Valid ValidObject object, BindingResult result) { 
    StringBuilder builder = new StringBuilder(); 
    List<FieldError> errors = bindingResult.getFieldErrors(); 
    for (FieldError error : errors) { 
     builder.append(error.getField() + " : " + error.getDefaultMessage()); 
    } 
    return builder.toString(); 
} 
+0

乾杯,作品像一個魅力:)雖然不錯,但不必爲每個驗證的方法做到這一點。 – Dormouse

+0

@Dormouse檢查我的答案:) – dharam

12

我相信一個更好的方法是使用ExceptionHandler

在您的Controller中,您可以編寫ExceptionHandler來處理不同的例外。下面是相同的代碼:

@ExceptionHandler(MethodArgumentNotValidException.class) 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
@ResponseBody 
public ValidationFailureResponse validationError(MethodArgumentNotValidException ex) { 
    BindingResult result = ex.getBindingResult(); 
    final List<FieldError> fieldErrors = result.getFieldErrors(); 

    return new ValidationFailureResponse((FieldError[])(fieldErrors.toArray(new FieldError[fieldErrors.size()]))); 
} 

當你發送一個錯誤的請求到控制器,驗證拋出MethodArgumentNotValidException類型的異常。所以理想的方法是編寫一個異常處理程序來專門處理這個異常。

在那裏你可以創建一個美麗的迴應,告訴用戶出錯的東西。 我主張這一點,因爲你只需要編寫一次,許多方法都可以使用它。 :)

UPDATE

當您在Controller使用@Valid註釋的方法參數,驗證自動調用並試圖驗證對象,如果對象是無效的,它拋出MethodArgumentNotValidException

如果Spring發現此異常的ExceptionHandler方法,它將執行此方法內的代碼。

您只需確保上述方法存在於您的控制器中。

現在還有另外一種情況,當您有多個Controller s您想驗證方法參數。在這種情況下,我建議你創建一個ExceptionResolver類,並把這個方法放在那裏。讓你的Controller擴展這個類,你的工作就完成了。

+0

好的,這似乎幹。你能再詳細一點嗎?我如何將它連接到我的'validatedMethod'?哦,而且這個方法缺乏一個名字。 – Dormouse

+0

你不需要。查看我的更新。 – dharam

+0

'ValidationFailureResponse'似乎不在我的任何依賴關係中,Google認爲它不存在。我可以添加哪個Maven依賴項? – Dormouse