我的要求是使用Spring 3.0和Hibernate Validator对表单执行服务器端验证。记住我使用AJAX调用提交表单。我的Controller类代码如下所示。
public ModelAndView generatePdfReport(@ModelAttribute("reports") @Valid ReportsCommand model, BindingResult result, ModelAndView modelAndView,
HttpServletRequest request, HttpServletResponse response) throws Exception {
if (result.hasErrors()) {
throw new BindException(result);
}
else{
...
}
...更新
@ExceptionHandler(BindException.class)
public @ResponseBody String handleException(BindException e,HttpServletRequest request, HttpServletResponse response)
{
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return e.getMessage();
}
这是我在控制器中放置的处理程序方法。我使用@ResponseBody注释,但它仍然以html格式显示响应,而不是JSON格式... 我的代码有什么问题.. 以下是我正在验证的字段
@Size(min = 2, max = 3, message = "calltype must between 2 to 3 Characters.")
private String callType;
如果我给大小超过三,它进入if并抛出异常。我想要的是,我想处理这个异常并返回json响应。我可以使用@ExceptionHandler来做到这一点但不知道如何。或者任何其他解决方案来解决这个问题也将不胜感激。
答案 0 :(得分:4)
没有自动方法将绑定错误转换为JSON。你应该手动完成。你可以在两个地方做到这一点:
BindException
的异常处理程序中。您使用@EXceptionHandler(BindException.class)
注释某个(基础)控制器的方法并执行相同的转换错误 - > json如上所述答案 1 :(得分:2)
只是提供有关Spring当前版本的更新: 如果你只是从你的conroller方法中抛出一个BindException(bindingResult),那么spring将返回一个详细的JSON回复,其中包含有关所有验证错误的信息:
@RestController中的方法
@RequestMapping(value = "/ballot", method = POST)
public BallotModel postBallot(@Valid @RequestBody BallotModel newBallot, BindingResult bindingResult) throws BindException {
log.trace("=> POST /ballot "+newBallot);
log.debug("ballotService="+ballotService);
if (bindingResult.hasErrors()) {
log.trace(" ballot is invalid: "+bindingResult.getAllErrors());
throw new BindException(bindingResult); // this generates a cool error message. But it should be documented :-)
}
return newBallot;
}
HTTP回复
{
"timestamp": "Sep 20, 2016 11:57:07 AM",
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.validation.BindException",
"errors": [
{
"field": "voteOrder",
"bindingFailure": false,
"objectName": "ballotModel",
"codes": [
"NotNull.ballotModel.voteOrder",
"NotNull.voteOrder",
"NotNull"
],
"arguments": [
{
"codes": [
"ballotModel.voteOrder",
"voteOrder"
],
"defaultMessage": "voteOrder"
}
],
"defaultMessage": "may not be null"
}
],
"message": "Validation failed for object='ballotModel'. Error count: 1",
"path": "/ballot"
}
答案 2 :(得分:1)
import org.springframework.validation.BindException
import java.net.BindException
答案 3 :(得分:0)
在我的春季启动版本(2.2.4.RELEASE)中,有一种方法可以在由ResponseEntityExceptionHandler
扩展的类(MyCustomExceptionHandler)下覆盖。
您可以使用的方法如下:
@Override
protected ResponseEntity<Object> handleBindException(BindException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
logger.info(ex.getMessage());
return super.handleBindException(ex, headers, status, request);
}
您可以返回包含相关对象的ResponseEntity。我只是在日志中打印了异常消息作为示例。