Spring 验证器自定义 HTTP 状态
Spring validator custom HTTP status
我想 return 自定义 HTTP 状态 422 而不是 spring 验证中的默认 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());
}
}
}
我如何在控制器中设置验证:
@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。如何自定义 return 上的 HTTP 状态?
谢谢
作为解决方法,您可以定义一个 ExceptionHandler 并覆盖默认行为。
@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(MissingServletRequestParameterException.class)
public ResponseEntity<Object> customHttpStatus() {
return ResponseEntity.status(422).build();
}
}
验证过程会抛出 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);
}
我想 return 自定义 HTTP 状态 422 而不是 spring 验证中的默认 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());
}
}
}
我如何在控制器中设置验证:
@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。如何自定义 return 上的 HTTP 状态?
谢谢
作为解决方法,您可以定义一个 ExceptionHandler 并覆盖默认行为。
@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(MissingServletRequestParameterException.class)
public ResponseEntity<Object> customHttpStatus() {
return ResponseEntity.status(422).build();
}
}
验证过程会抛出 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);
}