java - 如何在 Javalin 中验证列表主体
问题描述
我的 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 上进行了测试。
解决方案
我错过了,并且在 Javalin 文档中找不到的是,我必须使用数组类型而不是参数化的 Collection 类型。这有效:
TypedValidator<Item[]> requestValidator = ctx.bodyValidator(Item[].class);
List<Item> items = Arrays.asList(requestValidator.get());
不过,我很想知道为什么会这样——我怀疑它与 Java 的类型系统有关吗?
我也可以直接访问 Jackson ObjectMapper 对象并像使用 Jackson 一样使用它。缺点是我没有从 Javalin 的自动抛出BadRequestResponse
etc 中受益。我认为使用数组类型是一个很小的代价。
try {
List<ScheduleRequest> items = JavalinJackson.getObjectMapper().readValue(ctx.body(), new TypeReference<List<ScheduleRequest>>(){});
} catch (IOException e) {
throw new BadRequestResponse(e.getMessage());
}
推荐阅读
- c - 在 C 中报告退出状态时使用 execlp 和 execvp 的正确方法
- java - 持久性异常:
- bash - 将文本文件中的单词替换为 devnagari 的音素
- django - 不可散列的类型:'ReturnDict' drf django
- python - 在 tensorflow -Python 中加载 csv 文件
- python - if 和 elif 问题总是被跳过,不管输入
- winapi - WIN32 - 在 Windows CE 中读取 MyDocuments 中的文本文件返回空白
- java - 我正在尝试在 android 日志中打印或写入受保护的文件 /data/data/com.package/file
- laravel - ReferenceError:未定义Vue(laravel)
- java - 尝试解决 Leetcode 唯一路径问题时数字太大