基于注释的Spring beanvalidation

我正在研究一种基于注释的方法来使用spring模块validationSpring bean。 在本教程中 ,以下bean(省略了getters和setter)用作示例:

public final class User { @NotBlank @Length(max = 80) private String name; @NotBlank @Email @Length(max = 80) private String email; @NotBlank @Length(max = 4000) private String text; } 

如果违反特定validation规则,则使用的错误消息应遵循以下格式:

 bean-class.bean-propery[validation-rule]=Validation Error message 

上面显示的类的示例包括:

 User.email[not.blank]=Please enter your e-mail address. User.email[email]=Please enter a valid e-mail address. User.email[length]=Please enter no more than {2} characters. 

消息键包含类名的事实存在一些问题:

  1. 如果重命名该类,则还需要更改消息键
  2. 如果我有另一个类(例如Person),其电子邮件属性与User.email相同,我需要复制消息,例如

    Person.email [not.blank] =请输入您的电子邮件地址。
    Person.email [email] =请输入有效的电子邮件地址。
    Person.email [length] =请输入不超过{2}个字符。

实际上,文档声称可以为特定规则(例如@Email)配置默认消息,如下所示:

 email=email address is invalid 

如果找不到规则的特定于bean的消息,则应使用此缺省消息。 但是,我的经验是,这根本不起作用。

避免重复消息的另一种机制是将错误消息的密钥传递给规则注释。 例如,假设我已为@Email规则定义了以下默认错误消息

 badEmail=Email address is invalid 

如果我像这样注释相关属性,则应该使用此消息:

 @Email(errorCode="badEmail") private String email; 

但是我一次又一次地试了这个,它似乎没有用。 有没有人找到一种方法来避免在使用此validation框架时重复错误消息?

我快速浏览了BeanValidator API ,看起来您可能想尝试使用errorCodeConverter属性。

您需要实现自己的ErrorCodeConverter ,还是使用其中一个提供的实现?

 ....   .... 

注意:configurationLoader是本教程中使用的配置XML中定义的另一个bean

示例转换器:

 package contact; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springmodules.validation.bean.converter.ErrorCodeConverter; public class MyErrorCodeConverter implements ErrorCodeConverter { private Log log = LogFactory.getLog(MyErrorCodeConverter.class); @Override public String convertPropertyErrorCode(String errorCode, Class clazz, String property) { log.error(String.format("Property %s %s %s", errorCode, clazz.getClass().getName(), property)); return errorCode; // <------ use the errorCode only } @Override public String convertGlobalErrorCode(String errorCode, Class clazz) { log.error(String.format("Global %s %s", errorCode, clazz.getClass().getName())); return errorCode; } } 

现在属性应该工作:

 MyEmailErrorCode=Bad email class Foo { @Email(errorCode="MyEmailErrorCode") String email } 

Springvalidation确实有一个ErrorCodeConverter来执行此操作:

org.springmodules.validation.bean.converter.KeepAsIsErrorCodeConverter

使用此选项时,将检查资源包以获取以下代码:

[errorCode.commandBeanName.fieldName,errorCode.fieldName,errorCode.fieldClassName,errorCode]

  • errorCode是实际的validationerrorCode,例如。 not.blank,电子邮件。
  • commandBeanName与引用表单支持bean的模型键名相同。
  • fieldName是字段的名称。
  • fieldClassName是字段类名,例如。 java.lang.String,java.lang.Integer

因此,例如,如果我有一个通过键“formBean”在模型中引用的bean,并且类型为java.lang.String的字段emailAddress不包含电子邮件地址,这将导致errorCode电子邮件。 validation框架将尝试解析以下消息代码:

[email.formBean.emailAddress,email.emailAddress,email.java.lang.String,email]

如果errorCode被errorCode“badEmail”替换为:

@Email(错误码= “badEmail”)

框架将尝试解析的消息代码将是:

[badEmail.formBean.emailAddress,badEmail.emailAddress,badEmail.java.lang.String,badEmail]

我建议保持errodCode相同。 因此,一条消息可用于具有与之关联的errorCode的所有字段。 如果需要更具体地显示某个字段的消息,可以使用代码errorCode.commandBeanName.field向资源包添加消息。

applicationContext.xml文件中添加以下bean。