Java 容器对象的并发bean验证(例如列表)
上下文: 已公开RESTAPI并按顺序处理JSON格式输入请求的微服务。已处理的请求被反序列化、验证并放入Kafka主题以供进一步处理Java 容器对象的并发bean验证(例如列表),java,bean-validation,hibernate-validator,jsr380,Java,Bean Validation,Hibernate Validator,Jsr380,上下文: 已公开RESTAPI并按顺序处理JSON格式输入请求的微服务。已处理的请求被反序列化、验证并放入Kafka主题以供进一步处理 要验证的类的给定示例: // autogenerated from openapi schema using custom templates public class DataPayload { @NotNull @Size(min=1, max=100) private String description; @Valid @Siz
要验证的类的给定示例:
// autogenerated from openapi schema using custom templates
public class DataPayload {
@NotNull
@Size(min=1, max=100)
private String description;
@Valid
@Size(max=1024)
private List<DataLine> dataLines;
// getters, setters, etc.
public static class DataLine {
// lots of fields to be validated..
}
}
有没有人知道验证列表数据线
如何以最小的努力并行化
到目前为止,我有几个(明显的)选择:
validator.validate(dataLine)
以及不带数据线的验证数据负载validator.validate(withoutdataline(DataPayload))
ConstraintValidator
开放性问题-如何将嵌套/级联验证委托给默认机制?尽管选项是可行的,但我想知道是否有更聪明、更优雅的方法来解决这个问题。我觉得定制验证器是解决这个问题的方法。但我真的看不出并行验证有什么帮助。1024个项目并不多。我们已经尝试了第一个选项,在我们的情况下,它的工作速度提高了约2.5倍。我们没有进行深入的调查,但可能是因为深度级联。您是否在类似负载下尝试了生产代码中的第一个选项?因为虽然对于单个输入请求,它可能会运行得更快,但它也会使JVM充满线程,这使得并发进程接收到的资源更少。它显示出了预期的更高的吞吐量。我们有一些限制,目前输入REST API请求的处理是顺序的,因此当时只有一个活动请求需要处理。我觉得定制验证器是实现这一点的方法。但我真的看不出并行验证有什么帮助。1024个项目并不多。我们已经尝试了第一个选项,在我们的情况下,它的工作速度提高了约2.5倍。我们没有进行深入的调查,但可能是因为深度级联。您是否在类似负载下尝试了生产代码中的第一个选项?因为虽然对于单个输入请求,它可能会运行得更快,但它也会使JVM充满线程,这使得并发进程接收到的资源更少。它显示出了预期的更高的吞吐量。我们有一些限制,目前输入REST API请求的处理是顺序的,因此此时需要处理单个活动请求。
public static void main(String[] args) {
var validator = Validation.buildDefaultValidatorFactory().getValidator();
var violations = validator.validate(getDataPayload());
}