首页 > 解决方案 > 如何从 MethodArgumentNotValidException 类中提取字段名称和错误消息?

问题描述

我正在使用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中,第二个参数是错误消息。我想将字段名称和有效大小约束设置为消息。

我试图从引发的异常中获取字段名称,但不是给我 name ,而是给我我在引发此异常的控制器中使用title的参数名称。eventRequestBean

@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);
        }
    }

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

标签: javaspring-bootcontroller-advice

解决方案


@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属性来访问错误消息,如上所述。


推荐阅读