3

我的要求是使用 Spring 3.0 和 Hibernate Validator 对表单执行服务器端验证。请记住,我正在使用 AJAX 调用提交表单。我的控制器类代码如下所示。

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 但不要这样做不知道如何。或解决此问题的任何其他解决方案也将不胜感激。

4

4 回答 4

5

没有自动方法将绑定错误转换为 JSON。您应该手动执行此操作。您可以在两个地方执行此操作:

  • 内联 - 生成 JSON 并返回它,而不是抛出 BindException(使用与 JSON 一起使用的自定义 ModelAndView,或通过写入响应)
  • 在声明为处理的异常处理程序中BindException@EXceptionHandler(BindException.class)您使用和执行与上面相同的转换错误 -> json注释某些(基本)控制器的方法
于 2012-06-13T12:17:11.817 回答
5

导入这个包

import org.springframework.validation.BindException

不是这个

import java.net.BindException
于 2018-01-19T02:46:30.157 回答
3

只是为了提供有关 Spring 的当前版本的更新:如果您只是简单地从您的控制器方法中抛出 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"
}
于 2016-09-20T10:03:17.323 回答
2

在我的 Spring Boot 版本(2.2.4.RELEASE)中,有一个方法可以在扩展的类(MyCustomExceptionHandler)下覆盖ResponseEntityExceptionHandler

您可以这样使用的方法:

@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。我只是在日志中打印了异常消息作为示例。

于 2020-07-06T21:24:07.803 回答