【问题标题】:Spring validator custom HTTP statusSpring验证器自定义HTTP状态
【发布时间】:2018-12-12 18:53:31
【问题描述】:

我想在春季验证中返回自定义 HTTP 状态 422 而不是默认的 400。

我的验证者:

@Component
@RequiredArgsConstructor
public class EmailUpdateDtoValidator implements Validator {
private Errors errors;
private EmailUpdateDto emailUpdateDto;

@Override
public boolean supports(Class<?> clazz) {
    return EmailUpdateDto.class.equals(clazz);
}

@Override
public void validate(Object object, Errors errors) {
    this.errors = errors;
    this.emailUpdateDto = (EmailUpdateDto) object;

    validateEmail();
}

private void validateEmail() {
    if (!Email.isValid(emailUpdateDto.getEmail())) {
        errors.rejectValue("email", UserValidationErrorCodes.EMAIL_NOT_VALID.name());
    }
}
}

我如何在 Controller 中设置验证:

@Slf4j
@RestController
@RequiredArgsConstructor
public class UserController {
private final EmailUpdateDtoValidator emailUpdateDtoValidator;

@InitBinder("emailUpdateDto")
protected void initEmailValidationBinder(final WebDataBinder binder) {
    binder.addValidators(emailUpdateDtoValidator);
}

@RequestMapping(value = "/users/{hashedId}/email", method = RequestMethod.PUT)
public void updateEmail(@RequestBody @Valid EmailUpdateDto emailUpdateDto) {
    ...
}
}

使用此设置,我总是得到 400。如何自定义返回时的 HTTP 状态?

谢谢

【问题讨论】:

  • 您可以通过Errors \ BindingResult 输入控制器方法注入和EmailUpdateDtoValidator.validate() 显式调用来实现对验证的更多控制

标签: java spring validation spring-validator


【解决方案1】:

验证过程会抛出org.springframework.web.bind.MethodArgumentNotValidException,因此您可以向控制器添加异常处理程序:

import org.springframework.web.bind.MethodArgumentNotValidException;

   @ExceptionHandler
    public ResponseEntity<String> handleException(MethodArgumentNotValidException ex) {
        return new ResponseEntity<String>(HttpStatus.UNPROCESSABLE_ENTITY);

    }

【讨论】:

    【解决方案2】:

    作为解决方法,您可以定义一个 ExceptionHandler 并覆盖默认行为。

     @ControllerAdvice
     public class RestExceptionHandler extends ResponseEntityExceptionHandler {
    
        @ExceptionHandler(MissingServletRequestParameterException.class)
        public ResponseEntity<Object> customHttpStatus() {
            return ResponseEntity.status(422).build();
    
        }
    } 
    

    【讨论】:

      猜你喜欢
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多