Java 基于注释的springbean验证

Java 基于注释的springbean验证,java,validation,spring-modules,Java,Validation,Spring Modules,我正在研究一种基于注释的方法来验证SpringBean。在中,以下bean(省略getter和setter)用作示例: public final class User { @NotBlank @Length(max = 80) private String name; @NotBlank @Email @Length(max = 80) private String email; @NotBlank @Length(m

我正在研究一种基于注释的方法来验证SpringBean。在中,以下bean(省略getter和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;  
}
如果不遵守特定验证规则,则使用的错误消息应遵循以下格式:

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.
消息键包含类名这一事实带来了两个问题:

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

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

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

    email=email address is invalid
    
    @Email(errorCode="badEmail")
    private String email;
    
    如果找不到规则的特定于bean的消息,则应使用此默认消息。然而,我的经验是,这根本不起作用

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

    badEmail=Email address is invalid
    
    如果我对相关属性进行如下注释,则应使用此消息:

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

    然而,我尝试了一次又一次,它似乎不起作用。是否有人找到了在使用此验证框架时避免重复错误消息的方法?

    我快速查看了,您可能希望尝试errorCodeConverter属性

    您需要实现自己的,还是使用提供的实现之一

    ....
    <bean id="validator" class="org.springmodules.validation.bean.BeanValidator"
        p:configurationLoader-ref="configurationLoader"
        p:errorCodeConverter-ref="errorCodeConverter" />
    
    <bean id="errorCodeConverter" class="contact.MyErrorCodeConverter" />
    ....
    

    Spring验证确实有一个执行以下操作的ErrorCodeConverter:

    org.springmodules.validation.bean.converter.KeepAsIsErrorCodeConverter

    使用此选项时,将检查资源束中的以下代码:

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

    • errorCode是实际的验证错误代码,例如非空、电子邮件
    • commandBeanName与引用 形成支持bean
    • fieldName是字段的名称
    • fieldClassName是字段类名,例如java.lang.String、java.lang.Integer
    例如,如果我有一个bean,它在模型中被键“formBean”引用,并且类型为java.lang.String的字段emailAddress不包含电子邮件地址,这会导致错误代码email。验证框架将尝试解析以下消息代码:

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

    如果错误代码替换为错误代码“badEmail”,如下所示:

    email=email address is invalid
    
    @Email(errorCode="badEmail")
    private String email;
    
    @电子邮件(errorCode=“badEmail”)

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

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


    我建议保持错误代码不变。因此,一条消息可用于所有与错误代码关联的字段。如果需要更具体地说明某个字段的消息,可以使用代码errorCode.commandBeanName.field将消息添加到资源束。

    applicationContext.xml
    文件中添加以下bean

    <bean id="configurationLoader"
        class="org.springmodules.validation.bean.conf.loader.annotation.AnnotationBeanValidationConfigurationLoader" />
    
    <!-- Use the error codes as is. Don't convert them to <Bean class name>.<bean field being validated>[errorCode]. -->    
    <bean id="errorCodeConverter"
        class="org.springmodules.validation.bean.converter.KeepAsIsErrorCodeConverter"/>
    
     <!-- shortCircuitFieldValidation = true ==> If the first rule fails on a field, no need to check 
        other rules for that field -->   
    <bean id="validator" class="org.springmodules.validation.bean.BeanValidator"
        p:configurationLoader-ref="configurationLoader"
        p:shortCircuitFieldValidation="true" 
        p:errorCodeConverter-ref="errorCodeConverter"/>
    
    
    
    在上面显示的Spring配置中,什么是configurationLoader bean?您好,唐-我从您提到的教程网站下载了源代码,configurationLoader已经是在其配置xml中定义的bean之一。当我回到家并查看我编写的代码时,我可以更新这篇文章。教程中的ConfigurationLoaderbean类型为org.springmodules.validation.bean.conf.loader.annotation.AnnotationBeanValidationConfigurationLoader