Как сделать BindingResult в Spring Web 5 (загрузочный), как это делает обработчик ошибок по умолчанию? - PullRequest
0 голосов
/ 02 мая 2018

Я использую @RequestBody @Valid аннотации для проверки входного аргумента JSON для метода в контроллере. Это веб-приложение, обслуживающее API через spring-boot-starter-web 2.0.1.RELEASE.

Когда при проверке объекта обнаруживается ошибка, обработчик исключений по умолчанию создает действительно хороший JSON, объясняющий, что именно не так с вводом.

Проблема в том, что у меня есть собственный @ExceptionHandler, поскольку у моего API есть контракт на сообщения об ошибках. Я хочу включить валидационную JSON-структуру Spring в мой собственный JSON, который бы обернул ее.

В моем обработчике исключений я вижу, что получаю MethodArgumentNotValidException, но я не знаю, как десериализовать его в JSON так же, как Spring внутри. По-видимому, в Spring есть какой-то класс, который делает это.

Может ли кто-нибудь дать подсказку?

Ниже приведен пример JSON, который я хочу быть частью моего объекта

{
    "timestamp" : "2018-05-01T22:45:28.907+0000",
    "status" : 400,
    "error" : "Bad Request",
    "errors" : [{
            "codes" : ["NotNull.ticket.items[0].amount", "NotNull.ticket.items.amount", "NotNull.items[0].amount", "NotNull.items.amount", "NotNull.amount", "NotNull.java.math.BigDecimal", "NotNull"],
            "arguments" : [{
                    "codes" : ["ticket.items[0].amount", "items[0].amount"],
                    "arguments" : null,
                    "defaultMessage" : "items[0].amount",
                    "code" : "items[0].amount"
                }
            ],
            "defaultMessage" : "may not be null",
            "objectName" : "ticket",
            "field" : "items[0].amount",
            "rejectedValue" : null,
            "bindingFailure" : false,
            "code" : "NotNull"
        }
    ],
    "message" : "Validation failed for object='ticket'. Error count: 1",
    "path" : "/v1/databases/00000000-0000-0000-0000-000000000000/retail/pos/ticket"
}

1 Ответ

0 голосов
/ 02 мая 2018

Я не смог найти библиотечный метод, который решает эту проблему. Я пропустил рендеринг arguments, так как это слишком много усилий.

List<Map> validationErrors = new ArrayList<>();
BindingResult result = ((MethodArgumentNotValidException) e).getBindingResult();
for (FieldError error : result.getFieldErrors()) {
    Map<String, Object> res = new HashMap<>();
    res.put("codes", error.getCodes());
    res.put("defaultMessage", error.getDefaultMessage());
    res.put("objectName", error.getObjectName());
    res.put("field", error.getField());
    res.put("rejectedValue", error.getRejectedValue());
    res.put("bindingFailure", error.isBindingFailure());
    res.put("code", error.getCode());
    validationErrors.add(res);
}
for (ObjectError error : result.getGlobalErrors()) {
    Map<String, Object> res = new HashMap<>();
    res.put("codes", error.getCodes());
    res.put("defaultMessage", error.getDefaultMessage());
    res.put("objectName", error.getObjectName());
    res.put("code", error.getCode());
    validationErrors.add(res);
}

// now attach validationErrors to object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...