Порядок параметров проверки бина по умолчанию?

В настоящее время я пытаюсь предоставить пользовательское сообщение проверки с использованием проверки бина.

В настоящее время используется 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

Другие вопросы по тегам