Проверка Java полезной нагрузки JSON: возвращать ошибки в виде дерева - PullRequest
2 голосов
/ 03 мая 2019

У меня есть веб-приложение (Play Framework 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 или Джексона?

1 Ответ

0 голосов
/ 03 мая 2019

Используя проверку бинов, вы можете достичь этого, вызвав validate() самостоятельно и обработав коллекцию Set<ConstraintViolation<T>>.

Сначала вам нужно получить объект Validator. Могут быть способы сделать это лучше, но один способ - использовать фабрику (она использовалась в прошлом, она работала с зависимостью валидатора Hibernate от пути к классам):

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

Затем используйте валидатор, чтобы получить набор нарушений ограничения (Предполагая универсальный тип 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);
}

Обратите внимание, что для вложенных классов бинов вы получите разделенный точками «путь» для имен полей.

...