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