怎么说这个字段有来自外部的电子邮件注释
how to say this field has email annotation from outside
@NotNull(message = "emailAddress is mandatory")
@NotEmpty(message = "emailAddress cannot be empty")
@Email(message = "Invalid Email")
private String emailAddress;
我只是想从外部知道,emailAdress 有Email 注释。
有什么方法可以说它是电子邮件注释?
您可以为此使用反射。以下测试通过:
public class MyTest {
@Test
public void test() throws NoSuchFieldException {
HasEmailAddressValidator hasEmailAddressValidator = new HasEmailAddressValidator();
boolean result = hasEmailAddressValidator.hasEmailAddress(MyClass.class);
assertTrue(result);
}
@NoArgsConstructor
static
class HasEmailAddressValidator {
public boolean hasEmailAddress(Class<?> clazz) throws NoSuchFieldException {
return clazz.getDeclaredField("email").isAnnotationPresent(Email.class);
}
}
@Data
static
class MyClass {
@Email(message = "this is an email address")
private String email;
}
}
创建您的自定义注释。
`import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ TYPE, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = EmailValidator.class)
@Documented
public @interface ValidEmail {
String message() default "Invalid Email";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
// 电子邮件验证器
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class EmailValidator implements ConstraintValidator<ValidEmail, String> {
private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$";
private static final Pattern PATTERN = Pattern.compile(EMAIL_PATTERN);
@Override
public boolean isValid(final String username, final ConstraintValidatorContext context) {
return (validateEmail(username));
}
private boolean validateEmail(final String email) {
Matcher matcher = PATTERN.matcher(email);
return matcher.matches();
}
}
// 现在在你的 DTO 和模型中
@ValidEmail
@NotNull
@Size(min = 1, message = "Invalid Email")
private String email;
@NotNull(message = "emailAddress is mandatory")
@NotEmpty(message = "emailAddress cannot be empty")
@Email(message = "Invalid Email")
private String emailAddress;
我只是想从外部知道,emailAdress 有Email 注释。 有什么方法可以说它是电子邮件注释?
您可以为此使用反射。以下测试通过:
public class MyTest {
@Test
public void test() throws NoSuchFieldException {
HasEmailAddressValidator hasEmailAddressValidator = new HasEmailAddressValidator();
boolean result = hasEmailAddressValidator.hasEmailAddress(MyClass.class);
assertTrue(result);
}
@NoArgsConstructor
static
class HasEmailAddressValidator {
public boolean hasEmailAddress(Class<?> clazz) throws NoSuchFieldException {
return clazz.getDeclaredField("email").isAnnotationPresent(Email.class);
}
}
@Data
static
class MyClass {
@Email(message = "this is an email address")
private String email;
}
}
创建您的自定义注释。
`import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ TYPE, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = EmailValidator.class)
@Documented
public @interface ValidEmail {
String message() default "Invalid Email";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
// 电子邮件验证器
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class EmailValidator implements ConstraintValidator<ValidEmail, String> {
private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$";
private static final Pattern PATTERN = Pattern.compile(EMAIL_PATTERN);
@Override
public boolean isValid(final String username, final ConstraintValidatorContext context) {
return (validateEmail(username));
}
private boolean validateEmail(final String email) {
Matcher matcher = PATTERN.matcher(email);
return matcher.matches();
}
}
// 现在在你的 DTO 和模型中
@ValidEmail
@NotNull
@Size(min = 1, message = "Invalid Email")
private String email;