【问题标题】:Spring Validator and BindingResult - How to set different HttpStatus Codes?Spring Validator 和 BindingResult - 如何设置不同的 HttpStatus 代码?
【发布时间】:2015-08-03 06:14:34
【问题描述】:

亲爱的 Spring 社区,

我正在使用 Spring 构建我的项目。在我的 API 层中,我利用 Validator 接口来进行一些自定义验证并设置错误。

@Override
public void validate(Object obj, Errors e) {

    SignUpRequest signUpRequest = (SignUpRequest) obj;
    User user = userService.getUserByEmail(signUpRequest.getEmail());

    if (user != null) {
        e.rejectValue("user", ErrorCodes.USER_EXIST, "user already exist");
    }
}

现在,在我的 API 签名中,由于我使用的是 BindingResult 对象,如果用户为属性提供空值,则在我拥有的 @ControllerAdvice 中在我的 DTO 对象中,我将无法进入 @ExceptionHandler(MethodArgumentNotValidException.class)

这意味着,我将无法为提供的任何空值抛出HttpStatus.BAD_REQUEST。 在我的验证器的上述情况下,它不会是HttpStatus.BAD_REQUEST,而是HttpStatus.OK。所以我的问题是,如何根据我从验证器获得的错误提供不同的 HttpStatus 类型?还有一种方法可以让我的@ExceptionHandler(MethodArgumentNotValidException.class) 在我的@ControllerAdvice 中获取空值,并让我的其他自定义验证由 bindingResult 获取?

我希望我对这个问题很清楚。感谢任何帮助!

【问题讨论】:

  • 可以使用自定义 httpstatus new ResponseEntity>(serv.search(search, Listing.class), HttpStatus.OK); 从异常处理程序发送类似的内容
  • 当您在控制器中使用 BindingResult 时,ExceptionHandler 甚至不会被调用。

标签: spring validation api rest spring-mvc


【解决方案1】:

好的,我相信我想出了解决方案! 为了根据您的错误类型抛出不同的 HttpStatus,您需要有自定义异常。然后在验证器中抛出您的自定义异常。您的 ControllerAdvice 应该注册以获取自定义异常并相应地对其采取行动。

例如验证器应该有这样的东西:

if (!matcher.matches()) {
        e.rejectValue("email", ErrorCodes.EMAIL_INVALID, "email address is invalid");
        throw new BadRequestException("email address is invalid", e);
    }

    User user = userService.getUserByEmail(signUpRequest.getEmail());
    if (user != null) {
        e.rejectValue("email", ErrorCodes.USER_EXIST, "user already exist");
        throw new ValidationException("User Exist", e);
    }

Controller Advice 应该有:

@ExceptionHandler(ValidationException.class)
@ResponseBody
public ResponseEntity<Map<String, Object>> handleValidationException(
        ValidationException validationException) {

    Map<String, Object> result = createErrorResponse(validationException.getErrors());
    return new ResponseEntity<Map<String, Object>>(result, HttpStatus.OK);
}

@ExceptionHandler(BadRequestException.class)
@ResponseBody
public ResponseEntity<Map<String, Object>> handleBadRequestException(
        BadRequestException badRequestException) {

    Map<String, Object> result = createErrorResponse(badRequestException.getErrors());
    return new ResponseEntity<Map<String, Object>>(result, HttpStatus.BAD_REQUEST);
}

这样,您可以根据错误类型返回不同的 HttpStatus。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-03
    • 2017-12-30
    • 1970-01-01
    • 2016-05-28
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多