Мой запрос DELETE принимает список Item
s, который должен быть удален.
Я хочу проверить, что тело запроса является допустимым списком Item
объектов.
пример, приведенный в документации Javalin , не содержит списков.
Чтобы получить код для компиляции, мне нужно было сделать следующее:
TypedValidator<List> requestValidator = ctx.validatedBodyAsClass(List.class);
List<Item> items = requestValidator.getOrThrow();
logger.info("Received delete request for {}", Arrays.toString(items.toArray()));
logger.info("items is type {}", items.getClass());
for (Item item : items) {
logger.info("Deleting {}", item.name);
}
Проверкапроходит, и тело ctx
печатается правильно в следующей строке.Проблема в том, что в getOrThrow()
есть непроверенное назначение, и действительно, цикл не работает:
[qtp1679441380-34] INFO com.myorg.MyClass - Received delete request for [{name=FooName, type=BarType}]
[qtp1679441380-34] INFO com.ericsson.cdzm.ws.controllers.ScheduleController - items is type class java.util.ArrayList
[qtp1679441380-34] WARN io.javalin.core.ExceptionMapper - Uncaught exception
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.myorg.Item
at com.myorg.MyClass.deleteItems(MyClass.java:51)
Редактировать: java.util.LinkedHashMap
, кажется, потому что на самом деле items
имеет тип ArrayList<LinkedHashMap<String,String>>
.Другими словами, Джавалин вообще не анализировал и не проверял содержимое тела!Он только преобразовал сопоставления Json name=value
в карту Java.
Что может быть лучше для проверки входящего Json и анализа его в списке Item
s?
IПрошёл тестирование на Javalin 2.6.0 и 2.8.0.