Я знаю, что здесь есть несколько похожих вопросов о том, как анализировать ENUM, как анализировать настраиваемую структуру JSON. Но здесь мой вопрос заключается в том, как просто дать более качественное сообщение, когда пользователь отправляет JSON-файл не так, как ожидалось.
Это код:
@PutMapping
public ResponseEntity updateLimitations(@PathVariable("userId") String userId,
@RequestBody LimitationParams params) {
Limitations limitations = user.getLimitations();
params.getDatasets().forEach(limitations::updateDatasetLimitation);
params.getResources().forEach(limitations::updateResourceLimitation);
userRepository.save(user);
return ResponseEntity.noContent().build();
}
И тело запроса, которое я ожидал, выглядит так:
{
"datasets": {"public": 10},
"resources": {"cpu": 2}
}
Но когда они отправляют что-то вроде этого:
{
"datasets": {"public": "str"}, // <--- a string is given
"resources": {"cpu": 2}
}
Ответ покажет что-то подобное в журналах:
400 JSON parse error: Cannot deserialize value of type `java.lang.Integer` from String "invalid": not a valid Integer value; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.lang.Integer` from String "invalid": not a valid Integer value
at [Source: (PushbackInputStream); строка: 1, столбец: 23] (через цепочку ссылок: com.openbayes.api.users.LimitationParams ["наборы данных"] -> java.util.LinkedHashMap ["public"])
Но то, что я хочу, - это более удобочитаемое сообщение.
Я пытался использовать ExceptionHandler
для com.fasterxml.jackson.databind.exc.InvalidFormatException
, но это не работает.