如何将ConstraintViolationException 500错误转换为400错误请求?

问题描述 投票:0回答:2

如果我使用类似@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条消息?

spring-boot validation exception http-error
2个回答
1
投票

是,您可以创建一个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;        
    }
}   

0
投票

简单地,在用@ExceptionHandler注释的类中定义用@ControllerAdvice注释的方法:

@ControllerAdvice
public class YourControllerAdvice {

    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ConstraintViolationException.class)
    public void handleConstraintViolationException() {
    // Intentionally left blank
    }
}

@ControllerAdvice注释的类用于处理控制器级别的异常。

© www.soinside.com 2019 - 2024. All rights reserved.