我的 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>>
. 换句话说,Javalin 根本没有解析或验证正文内容!它仅将 Jsonname=value
映射转换为 Java Map。
验证传入的 Json 并将其解析为Item
s 列表的更好方法是什么?
我已经在 Javalin 2.6.0 和 2.8.0 上进行了测试。