java - 如何从 MethodArgumentNotValidException 类中提取字段名称和错误消息?

标签 java spring-boot controller-advice

我正在使用 javax.validation.Size 注释来执行字符串大小验证。

@Data
public class EventRequestBean {

    @Size( max = 40 )
    private String title;

    @Size( max = 50 )
    private String topic;
}

我正在使用全局异常处理程序将自定义异常抛出到客户端。

@ExceptionHandler( { MethodArgumentNotValidException.class } )
    public final ResponseEntity handleException( Exception e, WebRequest request )
    {
        if( e instanceof MethodArgumentNotValidException )
        {
            MethodArgumentNotValidException exception = (MethodArgumentNotValidException) e;
            String parameterName = exception.getParameter().getParameterName();
            //            return buildError(new DataException(GeneralConstants.EXCEPTION, "Invalid content length: field +"e))

            return null;
        }

        return null;
    }

在我的自定义异常 DataException 中,第二个参数是错误消息。我想将字段名称和有效大小限制设置为消息。

我试图从抛出的异常中获取字段名称,但它没有给我名称 title,而是给我正在使用的参数名称 eventRequestBean在抛出此异常的 Controller 中。

@PostMapping( "/event" )
    public ResponseEntity createEvent( @Valid @RequestBody EventRequestBean eventRequestBean )
    {
        try
        {
            log.info(GeneralConstants.LOGGER_CONSTANT,
                    " Entered create event controller, path:rest/events/event - POST");
            userCommons.throwExceptionForOtherThanAdminUser(getLoggedInUser());
            return buildResponse(eventService.addEvent(eventRequestBean, getLoggedInUser()));
        }
        catch( DataException e )
        {
            return buildError(e);
        }
    }

如何获取字段名称和设置的有效大小,以便创建自己的自定义异常?

最佳答案

@ExceptionHandler( { MethodArgumentNotValidException.class } )
    public final ResponseEntity handleException( Exception e, WebRequest request )
    {
        if( e instanceof MethodArgumentNotValidException )
        {
            MethodArgumentNotValidException exception = (MethodArgumentNotValidException) e;
            List<ObjectError> allErrors = exception.getBindingResult().getAllErrors();

            StringBuilder errorMessage = new StringBuilder("");

            for( ObjectError error : allErrors )
            {
                errorMessage.append(error.getDefaultMessage()).append(";");
            }
            return buildError(
                    new DataException(GeneralConstants.EXCEPTION, errorMessage.toString(), HttpStatus.BAD_REQUEST));
        }

        return null;
    }

首先,您需要提供带有大小限制的错误消息,如下所示,

@Data
public class EventRequestBean {

    @Size( max = 40, message = "The value '${validatedValue}' exceeds the max limit of {max} characters" )
    private String title;

    @Size( max = 50, message = "The value '${validatedValue}' exceeds the max limit of {max} characters" )
    private String topic;
}

现在,在异常处理程序中,您可以通过点击异常的 BindingResult 属性来访问错误消息,如上所述。

关于java - 如何从 MethodArgumentNotValidException 类中提取字段名称和错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59732327/

相关文章:

java - 使 Perl 风格的正则表达式解释器表现得像基本或扩展的正则表达式解释器

java - 优化 Spring RestControllerAdvice 多个异常

java - 如何使用 Boot 仅更改 Spring MVC 错误上的状态代码?

json - Spring Boot Actuator 端点的 pretty-print JSON 输出

java - Spring Boot 应用程序卡在 : Initializing Spring DispatcherServlet 'dispatcherServlet'

java - Spring boot Rest 以空主体响应异常,而不是在我的@ControllerAdvice 中覆盖的异常

java - @scope - spring - 使用注释设置范围 "prototype",行为类似于单例。我哪里出错了?

java - IntelliJ IDEA 2017.2.5 : Cannot determine embedded database driver

java - JsonMappingException : Unexpected token (START_OBJECT)

java - 如何模拟服务并测试 POST Controller 方法