Java验证JSON有效负载:将错误作为树返回

时间:2019-05-03 10:17:22

标签: java json validation playframework jackson

我有一个webapp(Play框架2.x,Java)接收JSON负载作为输入。

我有不同形状的输入有效载荷,例如:

{
  files: [{id: 1,name: null}}
  requiredAttribute: null,
}

我想以这种形式输出错误,类似于输入:

{
  files: [{name: "name can't be null"}}
  requiredAttribute: "requiredAttribute can't be null",
}

我想知道如何使用Java以这种形式输出错误而不会带来太多痛苦。

我知道我将失去在每个字段中输出多个错误的能力,我对此表示满意。

我可以使用任何外部库,只要可以很容易地在字段上声明约束,所以使用Java验证和验证约束注释之类的东西就很好了。但是到目前为止,我还没有找到对这种东西的任何支持。知道如何通过Play或Java验证或Jackson来实现吗?

1 个答案:

答案 0 :(得分:0)

使用bean验证,您可以自己调用validate()并处理Set<ConstraintViolation<T>>的集合来实现此目的。

您首先需要获取一个Validator对象。也许有一些方法可以做得更好,但是一种方法是使用工厂(过去使用过,它与类路径上的Hibernate验证程序依赖项一起工作):

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

然后使用验证器检索一组约束违规(假设具有相关约束注释的bean类的通用类型为T

Set<ConstraintViolation<T>> constraintViolations = validator.validate(myBean);

Map<String, String> fieldErrors = new HashMap<>();
for (ConstraintViolation<T> violation : constraintViolations) {
    String message = violation.getMessage();
    String field = violation.getPropertyPath().toString();
    fieldErrors.put(field, message);
}

请注意,对于嵌套的Bean类,您将获得一个点分隔的字段名称“路径”。