【问题标题】:What is the use of groups and payload in custom Annotation In Java?在 Java 中的自定义注释中组和有效负载的用途是什么?
【发布时间】:2021-02-06 03:41:20
【问题描述】:

这是我的代码, 我尝试在网上阅读很多东西,但无法理解的实际用法

Class<?> [] groups() default{};
Class<? extends Payload>[] payload() default{};

这是我使用过的代码。

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UniqueValidator.class)
public @interface UniqueValue {
    String message() default "Unique Constraint Violated";
    
    Class<?> [] groups() default{};
    Class<? extends Payload>[] payload() default{};
}

谢谢。

【问题讨论】:

    标签: java spring spring-mvc annotations


    【解决方案1】:

    组允许您限制验证期间应用的一组约束。

    在以下示例中,AClass 类具有属于AGroup 组的bool 属性。但是当一个属性的组没有指定时,即AClass的其他属性的情况,则属于默认组javax.validation.groups.Default

    import javax.validation.constraints.AssertTrue;
    import javax.validation.constraints.Min;
    import javax.validation.constraints.NotBlank;
    
    public class AClass {
    
        @NotBlank
        private String string;
    
        @Min(2)
        private int integer;
    
        @AssertTrue(groups = AGroup.class)
        private boolean bool;
    
        public AClass(String string, int integer, boolean bool) {
            this.string = string;
            this.integer = integer;
            this.bool = bool;
        }
    }
    

    组声明可以是一个简单的空接口。

    public interface AGroup { }
    

    在以下程序中,validate 方法验证属于默认组的所有属性。但是要验证其他组的属性,您必须在validate 方法中指定要验证的属性组。

    import java.util.Set;
    import javax.validation.ConstraintViolation;
    import javax.validation.Validation;
    import javax.validation.Validator;
    import org.junit.Assert;
    
    public class Program {
    
        public static void main(String[] args) {
            Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    
            // create a AClass and check that everything is ok with it.
            AClass a = new AClass("Foo", 2, false);
            Set<ConstraintViolation<AClass>> constraintViolations = validator.validate(a);
            Assert.assertEquals(0, constraintViolations.size());
    
            // but has it passed the bool field?
            constraintViolations = validator.validate(a, AGroup.class);
            Assert.assertEquals(1, constraintViolations.size());
            Assert.assertEquals("must be true", constraintViolations.iterator().next().getMessage()
            );
        }
    }
    

    来源:https://docs.jboss.org/hibernate/validator/5.2/reference/en-US/html/ch05.html#example-driver

    Bean Validation API 的客户端可以使用有效负载将自定义有效负载对象分配给约束。 API 本身不使用此属性。

    在以下示例中,TestBean 类的属性为 Payload

    import javax.validation.constraints.NotNull;
    
    public class TestBean {
    
        @NotNull(payload = {ErrorEmailSender.class})
        private String str;
    
        public String getStr() {
            return str;
        }
    
        public void setStr(String str) {
            this.str = str;
        }
    }
    

    ErrorEmailSender Payload 的实现:

    import javax.validation.ConstraintViolation;
    import javax.validation.Payload;
    
    public class ErrorEmailSender implements Payload {
    
        public void onError(ConstraintViolation violation) {
            System.out.println("Sending email to support team: "
                    + violation.getPropertyPath() + " "
                    + violation.getMessage());
        }
    }
    

    Client 程序检查TestBean 实例是否有效,如果无效,则调用无效属性的Payload

    import java.util.Set;
    import javax.validation.ConstraintViolation;
    import javax.validation.Validation;
    import javax.validation.Validator;
    
    public class Client {
    
        public static void main(String[] args) {
            Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    
            TestBean bean = new TestBean();
            Set<ConstraintViolation<TestBean>> constraintViolations = validator.validate(bean);
    
            if (constraintViolations.size() > 0) {
                constraintViolations.stream().forEach(Client::processError);
            } else {
                //proceed using user object
                System.out.println(bean);
            }
        }
    
        private static void processError(ConstraintViolation<TestBean> violation) {
            violation.getConstraintDescriptor().getPayload().forEach(p -> {
                if (ErrorEmailSender.class.isAssignableFrom(p)) {
                    try {
                        ((ErrorEmailSender) p.getDeclaredConstructor().newInstance()).onError(violation);
                    } catch (Exception ex) {
                        System.out.println(ex);
                    }
                }
            });
        }
    }
    

    你应该在输出中看到:

    Sending email to support team: str must not be null
    

    来源:

    【讨论】:

      猜你喜欢
      • 2020-12-26
      • 1970-01-01
      • 2019-02-08
      • 2020-02-02
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 2013-10-16
      • 2020-06-01
      相关资源
      最近更新 更多