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

@Email和spring自定义验证可以共存吗?,spring,hibernate-validator,customvalidator,Spring,Hibernate Validator,Customvalidator,我需要在使用web服务创建帐户时验证电子邮件和密码。我正在使用SpringREST控制器,并计划使用@Email(HibernateValidator)注释进行电子邮件id验证。对于密码验证,我必须通过实现验证程序接口来编写自定义验证程序 @XmlRootElement public class Account implements Serializable { @Email(message =AccountErrorCodes.ACCOUNT_EMAIL_VALIDATION)

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

@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时,spring调用passwordValidator,但无法验证电子邮件。我预计失败是由于不正确的电子邮件id。当我禁用自定义验证程序时,我会收到所需的错误消息


看来我错过了什么。我需要做点什么让它工作吗?还是不支持?如果不受支持,我可以直接从spring custom validator调用Hibernate validator以避免编写自己的电子邮件验证吗?

不是将自定义验证程序注入控制器,而是为其创建一个特殊的
@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 {};

}
@Target({METHOD,FIELD,ANNOTATION\u TYPE})
@保留(运行时)
@约束(validatedBy=PasswordValidator.class)
公共@接口密码{
字符串消息()默认值“{无效密码}”;
类[]组()默认值{};
班级你问:

通过编写我们自己的自定义注释,我仍然可以使用Spring提供的返回多个错误消息的绑定结果对象吗

您可以为任何类型创建自己的自定义批注。 例如:

电话号码 现在制作一个java文件:

Phone.java 通过这种方式,您将成功地获得一个自定义验证器

绑定结果 将捕获错误并从属性文件中获取消息


希望这能有所帮助。

通过编写我们自己的自定义注释,我还可以使用Spring提供的绑定结果对象来返回多个错误消息吗?还有什么我做得不正确的吗?我不确定你是否可以。我不建议你尝试。在控制器中使用验证逻辑,甚至更糟糕的是在两个不同的地方。你应该只在方法签名中使用
@Valid
注释来验证你的DTO。是的,我可以返回多条错误消息,我刚刚在stackoverflow()上找到的帖子似乎工作得很好。只需再次检查..我想使用的场景是“可否@Email和spring自定义验证共存?”不可能吗?
    @Phone
    @NotEmpty
    private String phone;
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 {};
      
}
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;
    }
    
    

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