java是否可以重载SpringBoot的ConstraintValidator isValid方法?
基本上,我的服务的作用是简化电子邮件通知的传递,以实现标准化/控制。因此,我公开了一个POST端点,该端点接收电子邮件Bean作为响应主体,其中包含接收方、发送方、抄送等信息,我希望验证传入Bean的字段(即电子邮件地址格式)
目前,我已经编写了一个自定义验证器,用于验证电子邮件地址列表(@EmailAddresses)。与引入另一个验证器相比,是否有方法重用同一验证器来验证“from”属性的电子邮件地址(该属性不是列表)
我的豆豆:
public class Email {
@JsonProperty("from")
private String from;
@EmailAddresses
@JsonProperty("to")
private List<String> to;
@EmailAddresses
@JsonProperty("cc")
private List<String> cc;
// some other fields
}
我的控制器:
@RestController
public class MyController {
@RequestMapping(value = "/", method = RequestMethod.POST)
public String deliverEmailNotification(@Valid @RequestBody Email email) {
// something
}
}
我的自定义验证批注:
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = EmailAddressesValidator.class)
public @interface EmailAddresses {
String message() default "Must be a valid email";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
验证实施:
public class EmailAddressesValidator implements
ConstraintValidator<EmailAddresses, List<String>> {
@Override
public void initialize(EmailAddresses emailAddresses) {
// do nothing
}
@Override
public boolean isValid(final List<String> emails, ConstraintValidatorContext constraintValidatorContext) {
// do something
}
}
所以本质上我想知道是否有可能做这样的事情:
public class EmailAddressesValidator implements
ConstraintValidator<EmailAddresses, List<String>>, ConstraintValidator<EmailAddresses, String> {
@Override
public void initialize(EmailAddresses emailAddresses) {
// do nothing
}
@Override
public boolean isValid(final List<String> emails, ConstraintValidatorContext constraintValidatorContext) {
// do something
}
@Override
public boolean isValid(final String email, ConstraintValidatorContext constraintValidatorContext) {
// do something
}
}
还是有别的办法
# 1 楼答案
由于重复类错误,无法实现ConstraintValidator的两个实例。然而,通过让验证接口由两个实现类进行验证,我能够实现与重载等效的功能
根据使用验证注释(本例中为@EmailAddress)注释的字段类型,相应的验证实现将启动
字符串列表的验证实现
字符串的验证实现