Вопрос по java, spring – Порядок параметров проверки бина по умолчанию?

8

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

В настоящее время используется Spring mvc 3.1.1 + валидация бина apache.

В моем бобе я указываю:

<code>@Size(min=1, max=50)
private String title;
</code>

И в моих messages.properties:

<code>Size.addForm.title=The title must not be empty and must not exceed {1} characters.
</code>

Из эксперимента я узнал, что:

{0} refers to 'title' {1} refers to the max, which is 50 {2} refers to the min, which is 1

и он будет отображаться какThe title must not be empty and must not exceed 50 characters. что правильно.

Но все это из экспериментов. Я думаюwhether there are documentations stating the order of parameters for the default constraints ?

Я пытался, надеюсь, используяSize.addForm.title=The title must not be empty and must not exceed {max} characters. основанный на ValidationMessages.properties по умолчанию, но заканчивается NumberFormatException на{max}, Я думаю, что это как-то связано с интерполяцией?

Update

Таким образом, каждый из них не работает независимо с NumberFormatException на{max} :

messages.properties : Size.addForm.title=The title must not be empty and must not exceed {max} characters. messages.properties : Size=The title must not be empty and must not exceed {max} characters. messages.properties : javax.validation.constraints.Size.message=The title must not be empty and must not exceed {max} characters. ValidationMessages.properties : Size.addForm.title=The title must not be empty and must not exceed {max} characters. ValidationMessages.properties : Size=The title must not be empty and must not exceed {max} characters.

Это трассировка стека:

<code>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)
</code>

Это единственный, который работает с именованным параметром, этоhas to be ValidationMessages.properties, and it has to be exactly the key that exists in the default resource bundle by the jsr 303 implementation :

ValidationMessages.properties : javax.validation.constraints.Size.message=you know wad, the size must be between {min} and {max}

По сути, текущий вывод заключается в том, что по умолчанию я не могу использовать именованные параметры в моих конкретных сообщениях. Именованный параметрonly works когда яoverride the exact key по умолчанию jsr303 ресурсный пакет&& когда я использую то же имя по умолчанию jsr303 имя файла resourcebundle, котороеValidationMessages.properties

Я предпочитаю избегать пока что играть с интерполяцией, поэтому первоначальный вопрос о том, как узнать, что {0} или {1} или {2} относится к тому, что в документации.

Ваш Ответ

3   ответа
0
for Size.foo.bar interpolation with names doesn't work however for size.foo.bar and baz.foo.bar it does (when validation annotation name isn't used; check is case sensitive)

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;
  }
4

JSR 303 Спецификация, 4.3.1.1. & quot; Алгоритм интерполяции сообщений по умолчанию & quot;

4 - Message parameters are extracted from the message string. constraint are replaced by the value of that attribute in the constraint declaration.

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

Приложение 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} тоже работает, похоже, это "особенность реализации") -But in the end, this is only the behavior of the default message interpolator, the standard defines a way how to replace them by your own.

Обновить

Реализация проверки Hibernate выглядит как дополнительная функция для форматирования значений${validatedValue:<format>}, - Может быть, это поможет вамjava.lang.NumberFormatException

@УвидетьСправочник валидатора Hibernate, глава 5.3. MessageInterpolator

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded bertie
0

    @Size(max=99)
    @NotBlank
    private String title;

причина@Size  позволяетWhitespace characters лайкspace

Похожие вопросы