豆验证默认参数的命令?(The orders of bean validation default

2019-07-29 07:15发布

我目前正在提供使用Bean验证自定义验证消息。

目前在使用Spring MVC 3.1.1 + apache的Bean验证。

在我的豆,我指定:

@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:大小=标题不能为空,且不得超过{max}个字符。
  • messages.properties:javax.validation.constraints.Size.message =标题不能为空,且不得超过{max}个字符。
  • ValidationMessages.properties:Size.addForm.title =标题不能为空,且不得超过{max}个字符。
  • ValidationMessages.properties:大小=标题不能为空,且不得超过{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 =你知道一叠,大小必须是{分钟}{MAX}之间

基本上,目前的结论是,在默认情况下,我不能使用命名我的特定邮件的参数。 当我重写的默认jsr303资源包的精确关键字命名的参数只能 &&当我使用相同的默认jsr303资源包文件名,这是ValidationMessages.properties

我宁愿避免具有插玩现在,因此如何找出{0}或{1}或{2}指的是什么文档中的原题。

Answer 1:

JSR 303规范 ,4.3.1.1。 “默认消息插值算法”

  • 4 - 消息参数从消息字符串提取。 那些匹配约束的属性的名称是由在约束声明该属性的值替换。

我读这这样的:你应该为消息参数使用注释属性的名称,而不是数字。

附录B中的规范的“标准的Res​​ourceBundle消息”示出的一些示例:

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}工作过,似乎是一个执行的“功能”) - 但最终,这只是默认消息插值的行为,该标准定义了一种如何更换他们通过自己的。


更新

休眠验证实施接缝具有一个附加特征格式值${validatedValue:<format>} -也许这可以帮助您与您的java.lang.NumberFormatException

@see Hibernate验证参考,第5.3章。 MessageInterpolator



Answer 2:

更好地利用:

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

导致@Size允许Whitespace charactersspace



Answer 3:

  • 对于Size.foo.bar插补名不起作用
  • 然而,对于size.foo.barbaz.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;
  }


文章来源: The orders of bean validation default parameters?