Порядок параметров проверки бина по умолчанию?
В настоящее время я пытаюсь предоставить пользовательское сообщение проверки с использованием проверки бина.
В настоящее время используется Spring mvc 3.1.1 + валидация бина apache.
В моем бобе я указываю:
@Size(min=1, max=50)
private String title;
И в моих messages.properties:
Size.addForm.title=The title must not be empty and must not exceed {1} characters.
Из эксперимента я узнал, что:
- {0} ссылается на заголовок
- {1} относится к максимуму, который составляет 50
- {2} относится к мин, который равен 1
и это будет отображаться как The title must not be empty and must not exceed 50 characters.
что правильно.
Но все это из экспериментов. Интересно , есть ли документация с указанием порядка параметров для ограничений по умолчанию?
Я пытался, надеюсь, используя Size.addForm.title=The title must not be empty and must not exceed {max} characters.
основанный на ValidationMessages.properties по умолчанию, но заканчивается NumberFormatException на {max}
, Я думаю, что это как-то связано с интерполяцией?
Обновить
Таким образом, каждый из них не работает независимо с NumberFormatException на {max}
:
- messages.properties: Size.addForm.title = Заголовок не должен быть пустым и не должен превышать {max} символов.
- messages.properties: Size = Заголовок не должен быть пустым и не должен превышать {max} символов.
- messages.properties: javax.validation.constraints.Size.message = Заголовок не должен быть пустым и не должен превышать {max} символов.
- ValidationMessages.properties: Size.addForm.title = Заголовок не должен быть пустым и не должен превышать {max} символов.
- ValidationMessages.properties: Size = Заголовок не должен быть пустым и не должен превышать {max} символов.
Это трассировка стека:
java.lang.NumberFormatException: For input string: "max"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.text.MessageFormat.makeFormat(Unknown Source)
at java.text.MessageFormat.applyPattern(Unknown Source)
at java.text.MessageFormat.<init>(Unknown Source)
at org.springframework.context.support.MessageSourceSupport.createMessageFormat(MessageSourceSupport.java:151)
at org.springframework.context.support.ResourceBundleMessageSource.getMessageFormat(ResourceBundleMessageSource.java:281)
at org.springframework.context.support.ResourceBundleMessageSource.resolveCode(ResourceBundleMessageSource.java:188)
at org.springframework.context.support.AbstractMessageSource.getMessageInternal(AbstractMessageSource.java:205)
at org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:146)
at org.springframework.context.support.AbstractApplicationContext.getMessage(AbstractApplicationContext.java:1214)
at org.springframework.web.servlet.support.RequestContext.getMessage(RequestContext.java:571)
at org.springframework.web.servlet.support.BindStatus.initErrorMessages(BindStatus.java:177)
at org.springframework.web.servlet.support.BindStatus.getErrorMessages(BindStatus.java:273)
at org.springframework.web.servlet.tags.form.ErrorsTag.exposeAttributes(ErrorsTag.java:173)
at org.springframework.web.servlet.tags.form.AbstractHtmlElementBodyTag.writeTagContent(AbstractHtmlElementBodyTag.java:48)
at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)
Это единственный, который работает с именованным параметром, это должен быть ValidationMessages.properties, и это должен быть именно тот ключ, который существует в пакете ресурсов по умолчанию реализацией jsr 303:
- ValidationMessages.properties: javax.validation.constraints.Size.message = вы знаете, wad, размер должен быть между {min} и {max}
По сути, текущий вывод заключается в том, что по умолчанию я не могу использовать именованные параметры в моих конкретных сообщениях. Именованный параметр работает только тогда, когда я переопределяю точный ключ в ресурсе jsr303 по умолчанию &&, когда я использую то же имя файла ресурса ресурса jsr303 по умолчанию, которое является ValidationMessages.properties
Я предпочитаю избегать пока что играть с интерполяцией, поэтому первоначальный вопрос о том, как узнать, что {0} или {1} или {2} относится к тому, что в документации.
3 ответа
Спецификация JSR 303, 4.3.1.1. "Алгоритм интерполяции сообщений по умолчанию"
- 4 - Параметры сообщения извлекаются из строки сообщения. Те, которые соответствуют имени атрибута ограничения, заменяются значением этого атрибута в объявлении ограничения.
Я читаю это так: вы должны использовать имя свойств аннотации для параметра сообщения вместо цифр.
Приложение B "Стандартные сообщения ResourceBundle" спецификации показывает несколько примеров:
javax.validation.constraints.Min.message=must be greater than or equal to {value}
javax.validation.constraints.Max.message=must be less than or equal to {value}
javax.validation.constraints.Size.message=size must be between {min} and {max}
javax.validation.constraints.Digits.message=numeric value out of bounds (<{integer} digits>.<{fraction} digits> expected)
Таким образом, кажется, что именованный paramerter - способ, которым вы должны использовать. (Тот {0}
, {1}
а также {2}
тоже работает, кажется, это "особенность" реализации) - Но в конце концов, это только поведение интерполятора сообщений по умолчанию, стандарт определяет способ их замены на ваш собственный.
Обновить
Реализация проверки Hibernate выглядит как дополнительная функция для форматирования значений. ${validatedValue:<format>}
, - Может быть, это поможет вам java.lang.NumberFormatException
@ См. Справочник валидатора Hibernate, глава 5.3. MessageInterpolator
- за
Size.foo.bar
интерполяция с именами не работает - Однако для
size.foo.bar
а такжеbaz.foo.bar
это делает (когда имя аннотации проверки не используется; проверка чувствительна к регистру)
Проверено с message.properties
файл, который добавляется в WebAppConfig
простирающийся WebMvcConfigurerAdapter
лайк:
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
@Override
public Validator getValidator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
Лучшее использование:
@Size(max=99)
@NotBlank
private String title;
причина @Size
позволяет Whitespace characters
лайк space