1

我参考了以下方法BindingResult

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

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

4

1 回答 1

1

因为 Web 应用程序是国际化的,所以当您拒绝一个对象并希望为其显示一条消息时,您不要使用硬编码文本,因为无论使用哪种语言,它都会显示相同的内容。

相反,您指定一个错误代码,稍后将其作为从包中检索正确消息的键(现在错误代码是从必须找到正确消息文本的方法的角度来看的消息代码)。

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

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

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

javadocDefaultMessageCodesResolver进一步解释它并给出了一个例子:

例如,在代码“typeMismatch”、对象名称“user”、字段“age”的情况下:

  1. 尝试“typeMismatch.user.age”
  2. 尝试“typeMismatch.age”
  3. 尝试“typeMismatch.int”
  4. 尝试“类型不匹配”

因此,可以利用此解析算法,例如显示绑定错误的特定消息,如“required”和“typeMismatch”:

at the object + field level ("age" field, but only on "user"); at the field level (all "age" fields, no matter which object name); or at the general level (all fields, on any object).

于 2012-10-28T17:35:23.243 回答