Dor*_*use 12 java spring-mvc bean-validation
我使用Bean Validation 1.2使用以下方法创建了一个Spring MVC REST服务:
@RequestMapping(value = "/valid")
public String validatedMethod(@Valid ValidObject object) {
}
Run Code Online (Sandbox Code Playgroud)
如果object无效,Tomcat会通知我,The request sent by the client was syntactically incorrect.
我validatedMethod
的调用永远不会被调用.
如何获取ValidObject
bean 中定义的消息?我应该使用一些过滤器或拦截器吗?
我知道我可以像下面一样重写,ConstraintViolation
从注入中得到一组s Validator
,但上面看起来更整洁......
@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();
}
}
Run Code Online (Sandbox Code Playgroud)
dha*_*ram 23
我相信更好的方法是使用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()])));
}
Run Code Online (Sandbox Code Playgroud)
向Controller发送错误请求时,验证程序会抛出类型异常MethodArgumentNotValidException
.所以理想的方法是编写一个异常处理程序来专门处理这个异常.
在那里,您可以创建一个美丽的响应,告诉用户出错的地方.我提倡这个,因为你必须只写一次,许多Controller
方法都可以使用它.:)
UPDATE
当您对方法参数使用@Valid注释时Controller
,将自动调用验证器并尝试验证该对象,如果该对象无效,则抛出该对象MethodArgumentNotValidException
.
如果Spring找到了ExceptionHandler
这个异常的方法,它将执行此方法中的代码.
您只需要确保控制器中存在上述方法.
现在有另一种情况,当Controller
你想要验证方法参数的多个s 时.在这种情况下,我建议你创建一个ExceptionResolver
类并将此方法放在那里.让你Controller
扩展这个课程,你的工作就完成了.
尝试这个
@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();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18081 次 |
最近记录: |