Spring Boot 2.1.5: не удалось заменить {0} именем поля в сообщении проверки - PullRequest
4 голосов
/ 11 июня 2019

Я пытаюсь обновить spring-boot 2.1.4 до 2.1.5.

В spring-boot 2.1.4 пользовательское сообщение об ошибке валидации с аргументами {0} корректно заменяется на Имя поля. Но при весенней загрузке 2.1.5 сообщение об ошибке проверки показывает {0} как есть.

код

  • messages.properties
notblank={0} must not be blank
  • PersonForm
import javax.validation.constraints.NotBlank;

class PersonForm {

    @NotBlank(message = "{notblank}")
    private String name;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return "Person(Name: " + this.name + ")";
    }
}

Вот мой пример проекта.
https://github.com/spikefin-goby/spring-boot-validation-sample

spring-boot 2.1.4 результат

В подпружиненной загрузке 2.1.4 на дисплее 「имя не должно быть пустым」
(правильно замените {0} на имя поля)
Spring-boot 2.1.4 сообщение проверки

BingingResult.errors [0] равно FieldError класс


spring-boot 2.1.5 результат

Но пружинная загрузка 2.1.5, дисплей display {0} не должен быть пустым
сообщение проверки правильности весенней загрузки 2.1.5

BingingResult.errors [0] равно LocalValidatorFactoryBean класс


Что я могу с этим поделать?


Обновление

Spring Boot 2.1.6 был выпущен 19 июня 2019 года. Эта проблема исправлена!

В подпружиненной загрузке 2.1.6 на дисплее 「имя не должно быть пустым」
(правильно замените {0} на имя поля)

Ответы [ 2 ]

1 голос
/ 11 июня 2019

На мой взгляд, вы столкнулись с проблемой # 23014: сообщение об ошибке проверки {0} не работает в spring-context-5.1.7

0 голосов
/ 11 июня 2019

Вы можете сделать это с помощью обработчика исключений, например:

public ResponseEntity<Object> handleConstraintViolation(ConstraintViolationException ex) {
    List<String> errors = new ArrayList<>();
    for (ConstraintViolation<?> violation : ex.getConstraintViolations()) {
        String error = String.format("%s.%s: %s", violation.getRootBeanClass().getSimpleName(),
                violation.getPropertyPath(), violation.getMessage());
        errors.add(error);
        logger.error(error);
    }

    ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, errors);
    return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
}

violation.getPropertyPath() возвращает имя поля, выдавшего нарушение.

В качестве примечания: я использую свой самодельный класс ApiError для отображения ошибок. Вам не нужно делать это таким образом, но важно, чтобы вы повторили нарушения ограничений внутри вашего ConstraintViolationException, чтобы получить путь к свойствам каждого из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...