在我的自定义注释中,我正在使用我将允许邮件的域
@Documented
@Constraint(validatedBy = ValidEmail.CheckIfValidMail.class)
//@Constraint(validatedBy = {})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
//@Repeatable(List.class)
@Retention(RUNTIME)
@Component
public @interface ValidEmail {
String message() default "Invalid String !!";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@interface List {
ValidEmail[] value();
}
@Component
public class CheckIfValidMail implements ConstraintValidator<ValidEmail, String> {
@Autowired
UserServiceImplOld userServiceImpl;
// @Value("${app.mail.allowedDomains:gmail}")
private String[] allowedDomainsForMail;
@Value("${app.mail.allowedDomains:gmail}")
public void setAllowedDomainsForMail(String[] allowedDomainsForMail) {
this.allowedDomainsForMail = allowedDomainsForMail;
}
// private String[] allowedDomainsForMail = new String[] { "gmail", "rediffmail", "yahoo" };
protected String message;
@Override
public void initialize(ValidEmail validEmail) {
this.message = validEmail.message() + " Allowed Domain(s): " + Arrays.toString(allowedDomainsForMail);
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null)
return true;
String allowedDomainRegEx = String.join("|", allowedDomainsForMail);
String mailRegex = "^(?i)[A-Za-z0-9+_.-]+@(?:" + allowedDomainRegEx + ")\\.(?:.*)$";
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(message).addConstraintViolation();
return value.matches(emailRegex);
}
}
}
如果我从 rest API 调用它,每次值都在那里,但是如果我从代码中显式调用验证,我可以在调试中看到 allowedMailDomains 值为 null
但是,如果我不从属性文件和硬编码中获取,那么它就像这样同时工作
对象
@Data //lombok
public class UserDto{
@ValidEmail(message = "Wrong emailId format !!")
private String emailId;
@NotNull
private Boolean isLoginAllowed;
}
在实施中
UserDto addUserDto = new UserDto();
addUserDto.setEmailId("satish");
addUserDto.setisLoginAllowed(false);
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
System.out.println("Validating :-\n" + validator.validate(addUserDto));
因此,在验证时转到 ValidMail 接口,并且 allowedMailDomains 值为 null