Параметры сообщения не разрешены в локализованных сообщениях проверки Spring Boot - PullRequest
1 голос
/ 06 октября 2019

Я строю проект, используя Spring Boot 2.1.8 , у меня есть spring-boot-starter-web в моем POM, и я вижу, что Maven тянет hibernate-валидатор 6.0.17 в путь к классам.

Мои сообщения находятся в папке ресурсов, и они выглядят правильно, поэтому при изменении языкового стандарта Spring загружает сообщение из правильного файла.

Соответствующий метод в моем @RestController принимает DTO с аннотациями @Valid и @RequestBody. Это вызывает ResponseEntityExceptionHandler # handleMethodArgumentNotValid () для запуска в моем совете контроллера, когда DTO не проходит проверку.

В моем DTO есть поле, аннотированное следующим образом: enter image description here

В My messages.properties есть следующие записи:

enter image description here

Вот как мое сообщение записывается в ответ: enter image description here

Как видно из сообщения параметры не интерполируются, вместо этого фигурные скобки удаляются - то же самое происходит, когда я использую {0} вместо {min} или когда я разрешаю аннотации размера использовать сообщение по умолчанию - javax.validation.constraints. Size.message.

Не могли бы вы посоветовать?

1 Ответ

0 голосов
/ 08 октября 2019

Этот ответ мне очень помог понять, в чем проблема.

Суть в том, что разрешенные сообщения Hibernate заканчиваются как сообщения по умолчанию в BindingResult.

Поэтому следует либо:

  1. удалить скобки из пользовательских сообщений, а затем использовать:
  String msg = messageSource.getMessage(e.getDefaultMessage(), e.getArguments(), locale);

для правильного поиска сообщений, интерполирующих все аргументы.

OR

Откажитесь от пользовательских сообщений в целом и используйте коды сообщений Spring - например, для аннотации Size используйте Size.model.field в message.properties и код для выполненияпоиск, например:
String msg = messageSource.getMessage(e, locale);

Я ожидал, что сообщение по умолчанию от BindingResult будет иметь полностью интерполированный текст, но кажется, что если сообщение в скобках, Hibernate ищет сообщение в пакете, но нене интерполировать параметры, вместо этого дезинфицировать строку и удалять любые фигурные скобки.

...