有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    由于重复类错误,无法实现ConstraintValidator的两个实例。然而,通过让验证接口由两个实现类进行验证,我能够实现与重载等效的功能

    根据使用验证注释(本例中为@EmailAddress)注释的字段类型,相应的验证实现将启动

    @Target({ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Constraint(validatedBy = { EmailAddressValidator.class, EmailAddressesValidator.class })
    public @interface EmailAddress {
    
        String message() default "Must be a valid email";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }
    

    字符串列表的验证实现

    public class EmailAddressesValidator implements ConstraintValidator<EmailAddress, List<String>> {
    
        ...
    }
    

    字符串的验证实现

    public class EmailAddressValidator implements ConstraintValidator<EmailAddress, String> {
    
        ...
    }