如果我使用类似@NotNull这样的约束,然后在控制器中使用
public User createUser(
@Validated
@RequestBody User user) {}
它给出了一个非常不错的400例外,并带有详细信息。
但是如果我这样使用自己的自定义验证器:
public User createUser(
@UserConstraint
@RequestBody User user) {}
它像这样抛出500个服务器错误:
javax.validation.ConstraintViolationException: createUser.user: Error with field: 'test35'
at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:117) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:69) ~[spring-security-core-5.1.6.RELEASE.jar:5.1.6.RELEASE]
是否有办法获得响应良好的400条消息?
是,您可以创建一个custom error handler
,然后还可以在响应和状态中添加任何内容。这是更改状态的简单方法:
1.-抛出status
时更改ConstraintViolationException
的简单方法。
import javax.validation.ConstraintViolationException;
@ControllerAdvice
public class ChannelErrorHandler {
@ExceptionHandler(ConstraintViolationException.class)
public void handleConstraintViolationException(ConstraintViolationException exception,
ServletWebRequest webRequest) throws IOException {
webRequest.getResponse().sendError(HttpStatus.NOT_FOUND.value(), exception.getMessage());
}
}
2.- ConstraintViolationException
出现时放置响应的自定义方式。
@ControllerAdvice
public class CustomErrorHandler {
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<CustomError> handleConstraintViolationException(ConstraintViolationException exception) {
CustomError customError = new CustomError();
customError.setStatus(HttpStatus.BAD_REQUEST);
customError.setMessage(exception.getMessage());
customError.addConstraintErrors(exception.getConstraintViolations());
return customError;
}
}
简单地,在用@ExceptionHandler
注释的类中定义用@ControllerAdvice
注释的方法:
@ControllerAdvice
public class YourControllerAdvice {
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(ConstraintViolationException.class)
public void handleConstraintViolationException() {
// Intentionally left blank
}
}
用@ControllerAdvice
注释的类用于处理控制器级别的异常。