这可以使用验证组来完成。以下是您将如何实现这一目标:
public class GroupValidationTest {
public static void main(String[] args) {
Validator v = Validators.newValidator();
Model m = new Model();
m.user = "Harry";
m.password = "Potter";
Set<ConstraintViolation<Model>> validate = v.validate(m, INPUT.class);
System.out.println(validate.size());
validate = v.validate(m, INPUT.class, OUTPUT.class);
System.out.println(validate.size());
validate = v.validate(m, OUTPUT.class);
System.out.println(validate.size());
m.password = null;
validate = v.validate(m, INPUT.class, OUTPUT.class);
System.out.println(validate.size());
validate = v.validate(m, OUTPUT.class);
System.out.println(validate.size());
}
public static class Model {
@NotEmpty(groups={INPUT.class, OUTPUT.class})
public String user;
@NotEmpty(groups={INPUT.class})
public String password;
}
public interface INPUT {}
public interface OUTPUT {}
}
这个输出:
0 -> Full object, validate INPUT
0 -> Full object, validate INPUT + OUTPUT
0 -> Full object, validate OUTPUT
1 -> null password, validate INPUT + OUTPUT
0 -> null password, validate OUTPUT
解释:
Hibernate 验证器框架支持用于验证约束的组。它们用于告诉验证器在特定验证尝试中验证哪些组。您可以在这里阅读所有相关信息:
https://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html/validator-usingvalidator.html#example-group-interfaces
我在代码示例中所做的是:
- 定义2组
INPUT和OUTPUT
- 标记要为两个组验证的用户属性
- 将密码属性标记为仅在输入时验证
对于 REST 方面(不同的问题),输入和输出的验证通常由拦截器完成,通常是 MessageBodyReader 和 Writer 类。这些负责读取用户输入并将其写出。您可以在球衣文档页面上阅读相关内容。
然后您可以实现自己的验证读取器/写入器,它知道在读取用户输入时只验证INPUT,而在写回序列化正文时只验证OUTPUT。
希望对你有帮助
阿图尔