【问题标题】:What is the use case of javax.validation.Payload in Bean Validation API?Bean Validation API 中 javax.validation.Payload 的用例是什么?
【发布时间】:2020-03-19 22:47:03
【问题描述】:

Bean Validation specification 定义:

约束注释必须定义一个有效负载元素,该元素指定与约束声明相关联的有效负载。 payload参数的类型为Payload[]

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

默认值必须是一个空数组。
每个可附加的有效载荷都扩展Payload

/**
 * Payload type that can be attached to a given
 * constraint declaration.
 * <p/>
 * Payloads are typically used to carry on metadata information
 * consumed by a validation client.
 * </p>
 * Use of payloads is not considered portable.
 */

我已经阅读了它的示例,但我不明白例如,如何在 JSF 中使用此元数据?你能解释一下现实世界中有效载荷的其他用例吗? payload携带的元数据是什么?

【问题讨论】:

    标签: jakarta-ee bean-validation payload


    【解决方案1】:

    也许这个link 会帮助你。

    
    import javax.validation.*;
    import javax.validation.constraints.NotNull;
    import java.util.Set;
    
    public class ConstraintPayloadExample2 {
        private static final Validator validator;
    
        static {
            Configuration<?> config = Validation.byDefaultProvider().configure();
            ValidatorFactory factory = config.buildValidatorFactory();
            validator = factory.getValidator();
            factory.close();
        }
    
        public interface AppErrorHandler<T> extends Payload {
            void onError (ConstraintViolation<T> violation);
        }
    
        public static class ErrorEmailSender<T> implements AppErrorHandler<T> {
            @Override
            public void onError (ConstraintViolation<T> violation) {
                System.out.println("Sending email to support team: " +
                                    violation.getPropertyPath() + " " +
                                    violation.getMessage());
            }
        }
    
        public static class TestBean {
    
            @NotNull(payload = {ErrorEmailSender.class})
            private String str;
    
            public String getStr () {
                return str;
            }
    
            public void setStr (String str) {
                this.str = str;
            }
        }
    
        public static void main (String[] args) {
            TestBean bean = new TestBean();
    
            Set<ConstraintViolation<TestBean>> constraintViolations =
                                validator.validate(bean);
    
            if (constraintViolations.size() > 0) {
                constraintViolations.stream().forEach(
                                    ConstraintPayloadExample2::processError);
            } else {
                //proceed using user object
                System.out.println(bean);
            }
        }
    
    
        private static void processError (ConstraintViolation<TestBean> violation) {
            Set<Class<? extends Payload>> payload =
                                violation.getConstraintDescriptor().getPayload();
    
            payload.forEach(p -> {
                if (AppErrorHandler.class.isAssignableFrom(p)) {
                    try {
                        AppErrorHandler errorHandler = (AppErrorHandler) p.newInstance();
                        errorHandler.onError(violation);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
    

    【讨论】:

    • 对我来说,这个答案看起来并不完整。 ,考虑在您的答案中使用解释,而不仅仅是发布代码和链接。我还是不明白这里Payload类的目的是什么。
    猜你喜欢
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多