Как извлечь имя поля и сообщение об ошибке из класса MethodArgumentNotValidException? - PullRequest
2 голосов
/ 14 января 2020

Я использую аннотацию 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 Я использую в контроллере, откуда выбрасывается это исключение.

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

Как я могу получить имя поля и установить допустимый размер, чтобы я мог создать свое собственное пользовательское исключение?

1 Ответ

1 голос
/ 15 января 2020
@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 свойство, как описано выше.

...