可以@Email和spring自定义验证共存吗?

时间:2014-07-27 03:49:26

标签: spring hibernate-validator customvalidator

我需要在使用网络服务创建帐户时验证电子邮件和密码。我正在使用Spring REST控制器并计划使用@Email(hibernate验证器)注释进行电子邮件ID验证。对于密码验证,我必须通过实现Validator接口来编写自定义验证器。

@XmlRootElement
public class Account implements Serializable {

    @Email(message =AccountErrorCodes.ACCOUNT_EMAIL_VALIDATION)
    private String emailId;

    private String password;

用于密码编写自己的验证器

@Autowired
private PasswordValidator passwordValidator;

@InitBinder
private void initBinder(WebDataBinder binder) {
    binder.setValidator(passwordValidator);
}

看起来两者并不存在。当我尝试验证EmailId时,弹簧调用passwordValidator但无法验证电子邮件。我预计由于错误的电子邮件ID导致失败。当我禁用自定义验证器时,我收到了所需的错误消息。

看起来我错过了什么。我需要做些什么才能让它发挥作用吗?或者它不受支持?如果不支持我可以直接从spring自定义验证器调用Hibernate验证器,以避免编写我自己的电子邮件验证吗?

2 个答案:

答案 0 :(得分:1)

不要在控制器中注入自定义验证器,而是为其创建一个特殊的@Password注释,并将其用作验证器。从控制器中删除任何约束逻辑,并在DTO类上完成所有操作。像这样:

@Target({ METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = PasswordValidator.class)
public @interface Password {
    String message() default "{Invalid password}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

您将找到大量使用您自己的验证器的自定义注释教程。希望有所帮助。

答案 1 :(得分:0)

你问道: 通过编写我们自己的自定义注释,我仍然可以使用Spring提供的Binding Result对象返回多个错误消息吗?

是的。

您可以为任何类型制作自己的自定义注释。 例如:

电话号码

    @Phone
    @NotEmpty
    private String phone;

现在制作一个java文件:

Phone.java

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;

import javax.validation.Constraint;
import javax.validation.Payload;

@Documented
@Constraint(validatedBy = PhoneValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Phone {


   String message() default "{Phone}";

   Class<?>[] groups() default {};

   Class<? extends Payload>[] payload() default {};

}

提供验证措施的课程:

PhoneValidator.java

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class PhoneValidator implements ConstraintValidator<Phone, String> {

    @Override
    public void initialize(Phone paramA) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean isValid(String phoneNo, ConstraintValidatorContext ctx) {
        // TODO Auto-generated method stub
        if(phoneNo == null) {
         return false;
        }

        //Validate phone numbers of format "1234567890"
         if (phoneNo.matches("\\d{10}")) return true;

        //validating phone number with -, . or spaces
        else if(phoneNo.matches("\\d{3}[-\\.\\s]\\d{3}[-\\.\\s]\\d{4}")) return true;

         //validating phone number with extension length from 3 to 5
        else if(phoneNo.matches("\\d{3}-\\d{3}-\\d{4}\\s(x|(ext))\\d{3,5}")) return true;

         //validating phone number where area code is in braces ()
        else if(phoneNo.matches("\\(\\d{3}\\)-\\d{3}-\\d{4}")) return true;

         //return false if nothing matches the input
        else return false;
    }



}

现在:

message_en.properties

包括:

#Custom validation annotation
Phone=Invalid format, valid formats are 1234567890, 123-456-7890 x1234

通过这种方式,您将成功获得自定义验证器。

BindingResult

将捕获错误并从属性文件中获取消息。

希望这有帮助。