老师请能否讲下有效负载是个什么东东,有什么用,怎么用?

来源:8-16 实战:自定义手机号验证

慕粉花小鱼

2020-03-13

有效负载不知道有什么用,请老师给个例子,解惑,谢谢

写回答

3回答

张小喜

2020-03-13

这里写了一个Demo.

其实payload(负载),它的作用就是携带一些信息,在我们手动执行校验时,能够根据这些信息作出不同的操作。

代码中举了两个常用的场景:

第一:通过定义两个不同等级的Payload接口,来标记实体对象中属性的重要程度,对于不同重要程度的属性,执行不同的处理逻辑。例如,对于INFO级别的属性,简单打印日志。但是对于ERROR级别的属性,就需要抛异常处理了。

第二:ERROR级别的接口中定义了一个回调方法,在属性校验失败后,可以执行这个回调方法。从而相当于将我们处理ERROR级别校验失败的业务逻辑与手动校验框架本身进行了解耦。

总之,一句话:payload = 负载 = 负责搭载某些信息供校验使用

1
0

张小喜

2020-03-13

代码markdown语法不管用,格式都乱了。如果看着不习惯就加我QQ,给你源文件。

1
0

张小喜

2020-03-13

public class PayloadTest {

   /**
    * 定义INFO级别的接口
    */
   interface PayloadInfo extends Payload {}

   /**
    * 定义ERROR级别的接口
    * @param <T>
    */
   interface PayloadError<T> extends Payload {
       /**
        * 定义ERROR错误的回调方法
        * @param violation
        */
       default void errorCallback(ConstraintViolation<T> violation) {
           // 抛出异常
           throw new RuntimeException("重要参数校验失败!" + violation.getMessage());
       }
   }

   /**
    * 定义一个待验证的实体类
    */
   class User {
       /**
        * 使用@NotEmpty约束
        * TODO 根据payload指定不同级别的接口,决定校验不通过时执行什么策略
        */
       @NotEmpty(payload = PayloadInfo.class)
       private String username;
   }

   @Test
   public void run() {
       // 手动校验器
       Validator validator = Validation.buildDefaultValidatorFactory()
               .getValidator();

       // 校验User实体,并遍历未通过校验的属性对象violation
       validator.validate(new User()).forEach(violation -> {

           // 获取属性上配置的payload
           violation.getConstraintDescriptor().getPayload()
                   .forEach(payload -> {

                       // 如果payload是ERROR级别的接口
                       if (PayloadError.class.isAssignableFrom(payload)) {
                           System.err.println("等级为ERROR的校验失败,必须要处理!");

                           // 执行ERROR级别接口的错误回调方法
                           try {
                               PayloadError payloadError = (PayloadError) payload.newInstance();

                               payloadError.errorCallback(violation);
                           } catch (Exception e) {
                               e.printStackTrace();
                           }
                       }

                       // 如果payload是INFO级别的接口
                       if (PayloadInfo.class.isAssignableFrom(payload)) {

                           // 只是简单的打印日志,不做强制处理
                           System.out.println("等级为INFO的校验失败,可以不处理!");
                       }
                   });
       });
   }

}

1
0

Java高效编程技巧实践 告别996

可以改变的编程效率

1451 学习 · 326 问题

查看课程