java - 以反应方式从自定义杰克逊反序列化器中的数据库加载实体
问题描述
我有一个 Quarkus 反应式应用程序,我在其中使用自定义 Jackson 解串器。在这个反序列化器中,我必须调用一个数据库。
public class MyTypeDeserializer extends StdDeserializer<MyType> {
public MyTypeDeserializer() {
this(null);
}
public MyTypeDeserializer(Class<?> vc) {
super(vc);
}
@Override
public MyType deserialize(
JsonParser jsonparser, DeserializationContext context)
throws IOException {
// Lookup the instantiated db service which has been added to jackson on application startup
MyTypeService service = (MyTypeService) context
.findInjectableValue("myTypeServiceBean", null, null);
// Get the info from json
String info = jsonparser.getText();
// Find myType instance in database
return service.find("info = :info", Parameters.with("info", info)).await().indefinitely();
}
运行此代码会导致:
java.lang.IllegalStateException: The current thread cannot be blocked: vert.x-eventloop-thread-5
我了解此错误告诉我调用线程因await().indefinitely()
调用而被阻塞。但是我找不到从数据库中检索实例的另一种方法。我必须等到从数据库中加载数据。如何做到这一点?
解决方案
你不能在 a 中真正做到这一点,StdDeserializer
因为没有办法不阻止该方法的实现。
我建议将负载从数据库转移到反序列化发生后运行的代码的一部分。
推荐阅读
- if-statement - 当我输入一个无效的三角形但代码没有给我预期的结果时
- parsing - 一些 rss 提要内容在 Vala Gtk.Label 中显示不正确的奇怪问题
- uart - 使用 u-boot 通过串口更新文件
- c# - 遇到代码无法识别输入的密码是否正确的问题
- c++ - 钻石问题 C++:钻石的派生类调用默认构造函数
- php - php 每次刷新时停止运行 sql 查询
- python - 关于python matplotlib x轴日期格式设置
- c++ - 重新排序日志文件中的数据(Leetcode)
- tensorflow - 如何在 gpflow 中使用带有非变分 GPR 的小批量?
- c - 我可以以某种方式将可变数量的字符存储在字符串数组中吗?