老师请能否讲下有效负载是个什么东东,有什么用,怎么用?
来源:8-16 实战:自定义手机号验证

慕粉花小鱼
2020-03-13
有效负载不知道有什么用,请老师给个例子,解惑,谢谢
3回答
-
这里写了一个Demo.
其实payload(负载),它的作用就是携带一些信息,在我们手动执行校验时,能够根据这些信息作出不同的操作。
代码中举了两个常用的场景:
第一:通过定义两个不同等级的Payload接口,来标记实体对象中属性的重要程度,对于不同重要程度的属性,执行不同的处理逻辑。例如,对于INFO级别的属性,简单打印日志。但是对于ERROR级别的属性,就需要抛异常处理了。
第二:ERROR级别的接口中定义了一个回调方法,在属性校验失败后,可以执行这个回调方法。从而相当于将我们处理ERROR级别校验失败的业务逻辑与手动校验框架本身进行了解耦。
总之,一句话:payload = 负载 = 负责搭载某些信息供校验使用
10 -
张小喜
2020-03-13
代码markdown语法不管用,格式都乱了。如果看着不习惯就加我QQ,给你源文件。
10 -
张小喜
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的校验失败,可以不处理!");
}
});
});
}
}10
相似问题