就Spring验证而言,错误代码和消息代码之间的区别是什么?

时间:2012-10-26 14:22:23

标签: spring spring-mvc

我参考BindingResult中的以下方法:

BindingResult.html#resolveMessageCodes(java.lang.String, java.lang.String)

我试图弄清楚错误代码和消息代码之间的区别。有人可以提供一个示例,尤其是一个说明为什么可能有多个消息代码用于给定错误代码的示例?

1 个答案:

答案 0 :(得分:1)

由于Web应用程序是国际化的,当您拒绝某个对象并希望显示一条消息时,您不会使用硬编码文本,因为无论语言如何都会显示相同的文本。

相反,您指定一个错误代码,以后将服务器作为从捆绑包中检索正确消息的密钥(现在错误代码是从必须找到正确消息文本的方法的角度来看的消息代码)

您的错误代码解析为更多消息代码,因为Spring(基于实现)为您添加了一些额外的消息代码。这是一个代码段from the Spring documentation

  

[...]它注册的错误代码由使用的MessageCodesResolver决定。默认情况下,使用DefaultMessageCodesResolver,例如,它不仅使用您提供的代码注册消息,还包含传递给reject方法的字段名称的消息。因此,如果您使用rejectValue(“age”,“too.darn.old”)拒绝某个字段,除了too.darn.old代码之外,Spring还会注册too.darn.old.age和too.darn.old .age.int(所以第一个将包含字段名称,第二个将包括字段的类型);这样做是为了方便开发人员定位错误消息等。 [...]

最后一个陈述是有更多消息代码的原因,以控制对用户显示的消息,从一般消息(例如“需要的值”)到给定上下文的更具体的消息(例如“字段XXX“)需要一个值。

javadoc for DefaultMessageCodesResolver进一步解释并举例说明:

  

例如,如果代码为“typeMismatch”,则对象名称为“user”,字段为“age”:

     
      
  1. 尝试“typeMismatch.user.age”
  2.   
  3. 尝试“typeMismatch.age”
  4.   
  5. 尝试“typeMismatch.int”
  6.   
  7. 尝试“typeMismatch”
  8.         

    因此可以利用此分辨率算法来显示绑定错误的特定消息,如“required”和“typeMismatch”:

         

    在对象+字段级别(“年龄”字段,但仅限于“用户”);       在字段级别(所有“年龄”字段,无论哪个对象名称);       或者在一般水平(所有领域,任何对象)。