我的问题是我逐个获得验证错误,但不是按顺序。 所以,任何好友都可以根据用户的需要告诉我如何显示错误。
答案 0 :(得分:0)
所以,我希望这是你想要的,或者至少会把你推向正确的方向:
在我的控制器中,我有以下方法:
@RequestMapping(value = "/test/createEntry", method = RequestMethod.POST)
@ResponseBody
public void doAndValidateSomething(@RequestBody @Valid ValidationFormModel,
HttpServletResponse response) {
try {
testService.doSomething(model);
} catch (NormalException e) {
log.error(String.format("Error doing something! Values -> name: %s, address: %s",
model.getName(), model.getAddress(), e);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
这是我的异常处理程序(也用于控制器)。请注意此处的e.getBindingResult.getAllErrors()
行,它会为您提供所有错误的列表。在我的情况下,我决定只使用iterator.next()
的第一个错误,但这只是我想要的,请随意使用getAllErrors()
:
@ExceptionHandler(MethodArgumentNotValidException.class)
public void validationException(MethodArgumentNotValidException e, HttpServletResponse response) throws IOException {
response.getWriter().append(e.getBindingResult().getAllErrors().iterator().next().getDefaultMessage());
log.error("Validation failed!", e);
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
}
我的模型看起来有点像这样:
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
public class ValidationFormModel {
@Length(max=50,min=2, message= "...")
@NotEmpty(message = "....")
private String name;
@Length(max=250,min=1, message= "...")
private String address;
//constructor, getters and setters...
}
在客户端,我使用以下jquery / json通过post发送我的数据并显示实际错误。在您的错误处理程序中,您可以根据需要更改逻辑(我假设您希望直接在表单输入字段或其他内容显示每个错误):
var approveNewSend = function () {
var newEntry = JSON.stringify({
name: $('#nameInput').val(),
});
$.ajax({
url: "${pageContext.request.contextPath}/test/createEntry",
type: "POST",
data: newEntry,
contentType: "application/json; charset=utf-8",
dataType: "json"
})
.success(function () {
console.log('yay!');
})
.error(function (data) {
$("#nerrorMessage").html("Error validating: " + data.responseText);
});
};
希望这有帮助!如果有什么不清楚,请随时询问。