首页 > 解决方案 > 无法使用 jooq-vertx-classic-reactive 插入 json 值:无法将 org.jooq.JSON 强制转换为预期的类 java.lang.Object

问题描述

我有 3 列的表,其中之一具有 'json' 类型。当我尝试插入值时(使用空 json,但它是否为空并不重要,它不会以任何方式工作。)然后我收到错误:

java.lang.AssertionError: io.vertx.core.impl.NoStackTraceThrowable: 位置 [1] 的参数,类 = [org.jooq.JSON] 和值 = ["{}"] 无法强制转换为预期的类 = [java.lang.Object] 用于编码。

这是我的代码:

@Override
  public Future<Void> saveInstances(List<Instances> instances, String tenantId) {
    return getQueryExecutor(tenantId).transaction(queryExecutor -> queryExecutor.execute(dslContext -> {
      InsertValuesStep3<InstancesRecord, UUID, JSON, String> insertValues = dslContext.insertInto(INSTANCES, INSTANCES.INSTANCE_ID,
          INSTANCES.JSON, INSTANCES.REQUEST_ID);
      instances.forEach(instance -> insertValues.values(instance.getInstanceId(), instance.getJson(), instance.getRequestId()));
      return insertValues;
    })
      .map(rows -> null));
  }

getQueryExecutor(tenantId)返回 ReactiveClassicGenericQueryExecutor 对象 insatnce.getJson() reutns org.jooq.JSON 类型。

数据库是 PostgreSQL。 我不想使用任何转换器等。文档说 jooq 原生支持 JSON 和 jsonb,但是它们有什么问题呢?同样,我没有为包含 JSON 或 jsonb 列的表生成 rowMappers。

<jooq.version>3.13.2</jooq.version>
<vertx-jooq.generator.version>5.1.1</vertx-jooq.generator.version>
<vertx-jooq.classic-reactive.version>5.2.0</vertx-jooq.classic-reactive.version>

对此感到困惑,任何建议都会有所帮助。谢谢!

标签: javajsonpostgresqlvert.xjooq

解决方案


我得到了同样的错误并通过添加到 pom.xml 来解决它:

<configuration>
   <generator>
      <database>
         <forcedTypes>
            <forcedType>
               <userType>io.vertx.core.json.JsonObject</userType>
               <converter>io.github.jklingsporn.vertx.jooq.shared.postgres.JSONToJsonObjectConverter</converter>
               <expression>[column expression here]</expression>
               <types>(?i:JSON)</types>
            </forcedType>
         </forcedTypes>
      </database>
   </generator>
</configuration>

替换JSONToJsonObjectConverterJSONBToJsonObjectConverter, 如果您有 JSONB 列并指定它的类型。在表达式中,您指定应用特定转换器的列(例如,仅列名)。

这会将org.jooq.JSONPOJO 中的类型替换为io.vertx.core.json.JsonObject.

小心选择vert.x和的兼容版本vertx-jooq


推荐阅读