#java #bean-validation #hibernate-validator
#java #компонент-проверка #спящий режим-валидатор
Вопрос:
Когда я запускаю свой проект, локализованные сообщения проверки, расположенные в src /main/resources (когда проект не упакован и запускается с помощью встроенного в IDE runner) или WEB-INF / classes (когда проект упакован и развернут), не разрешаются. Я всегда получаю сообщения по умолчанию.
Тем не менее, когда я запускаю тесты, сообщения разрешаются правильно…
Я использую проверку ванили (весна не мешает).
validator = Validation.byDefaultProvider().configure().messageInterpolator(new LocaleAwareMessageInterpolator(locale)).buildValidatorFactory().getValidator();
LocaleAwareMessageInterpolator расширяет стандартный ResourceBundleMessageInterpolator .
public class LocaleAwareMessageInterpolator extends ResourceBundleMessageInterpolator {
private Locale defaultLocale = Locale.FRENCH;
public LocaleAwareMessageInterpolator(Locale defaultLocale) {
this.defaultLocale = defaultLocale;
}
@Override
public String interpolate(final String messageTemplate, final Context context) {
return interpolate(messageTemplate, context, defaultLocale);
}
@Override
public String interpolate(final String messageTemplate, final Context context, final Locale locale) {
try {
return super.interpolate(messageTemplate, context, locale);
} catch (ExceptionInInitializerError e) {...}
}
}
Должен ли я переместить их в другое место?
Должен ли я где-то установить некоторые параметры, чтобы указать местоположение .properties?
Комментарии:
1. Каково точное имя и расположение файла свойств? Это должно быть ValidationMessages.properties в корне пути к классу. src/main/resources — это не то место, откуда он берется. Это исходное местоположение, сборка (независимо от используемого вами инструмента или IDE) копирует файл в другое местоположение. Это также может помочь просмотреть ваш код для LocaleAwareMessageInterpolator .
2. Спасибо. Имя ValidationMessages.properties . Путь развертывания — WEB-INF/classes . Я опубликую код.
Ответ №1:
Я решил проблему, передав PlatformResourceBundleLocator в конструктор ResourceBundleMessageInterpolator . Я не знаю, почему система не может получить ValidationMessages из WEB-INF / classes (я думал, что это автоматически), но это работает.
public LocaleAwareMessageInterpolator(Locale defaultLocale) {
super(new PlatformResourceBundleLocator("ValidationMessages"));
this.defaultLocale = defaultLocale;
}
В документе Hibernate об этом довольно ясно. Я пропустил это.