【问题标题】:Jooq DataTypeException since Spring.Boot 2.4.x自 Spring.Boot 2.4.x 以来的 Jooq DataTypeException
【发布时间】:2021-07-05 02:23:42
【问题描述】:

自升级到 Spring Boot 2.4.x 后检索数据时出现 DataTypeException。它在 2.3.9.RELEASE 中运行良好。

org.jooq.exception.DataTypeException: No Converter found for types MyBaseType and MyInheritType1 at 
org.jooq.impl.Tools.converterOrFail(Tools.java:1132) at      
org.jooq.impl.Tools.converterOrFail(Tools.java:1148) at 
org.jooq.impl.AbstractRecord.get(AbstractRecord.java:270) at 
org.jooq.impl.AbstractResultQuery.fetchOne(AbstractResultQuery.java:576) at 
org.jooq.impl.SelectImpl.fetchOne(SelectImpl.java:3019)

MyInheritType1 扩展 MyBaseType。 这些类使用 lombok @Data,所以它们应该有适当的设置器。

@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "_class")
@JsonSubTypes(
        {
                @JsonSubTypes.Type(value = MyInheritType1.class, name = "Type1"),
                @JsonSubTypes.Type(value = MyInheritType2.class, name = "Type2")
        })
public class MyBaseType 
{
    private UUID id;
    private String disclaimerLongText = "";
    private LocalDateTime creationTime;
    private Map<UUID, String> images = new HashMap<>();
}

继承的类型:

@Data
public class MyInheritType1 extends MyBaseType 
{
    private String baseMap;
    private EnumType someEnum;
    private List<LayerType> layerTypes = new ArrayList<>();
    private double[] center;
}

我这样检索数据:

return dsl.select(PROJECT.DETAILS).from(PROJECT)
                .where(PROJECT.ID.eq(id.toString()))
                .fetchOne(PROJECT.DETAILS, MyInheritType1.class);

PROJECT.DETAILS 定义如下:

public final TableField<ProjectRecord, ProjectDetails> DETAILS = createField(DSL.name("details"), SQLDataType.JSONB.nullable(false), this, "", new ProjectDetailsBinding());

ProjectDetailsBinding 看起来像这样:

public class ProjectDetailsBinding extends JsonBBinding<MyBaseType>
{
    @Override
    protected Class<ProjectDetails> getBindingType()
    {
        return MyBaseType.class;
    }
}

public abstract class JsonBBinding<T> implements Binding<JSONB, T>
{
    private ObjectMapper objectMapper = new ObjectMapper()
            .registerModule(new JavaTimeModule());

    protected abstract Class<T> getBindingType();

    @Override
    public Converter<JSONB, T> converter()
    {
        return new Converter<JSONB, T>()
        {
            @Override
            public T from(JSONB o)
            {
                if (o == null)
                    return null;
                try
                {
                    return objectMapper.readValue(o.data(), getBindingType());
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            public JSONB to(T t)
            {
                try
                {
                    return JSONB.valueOf(objectMapper.writeValueAsString(t));
                } catch (JsonProcessingException e)
                {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            public Class<JSONB> fromType()
            {
                return JSONB.class;
            }

            @Override
            public Class<T> toType()
            {
                return getBindingType();
            }
        };
    }
    [..]
}

由于它与 2.3.9.RELEASE 一起使用,我想知道 Spring Boot 或 Jooq 发生了什么变化,现在会导致这种不同的行为吗?

【问题讨论】:

  • 什么是 PROJECT.DETAILS?
  • @SimonMartinelli 哎呀我错过了。我添加了它和绑定类。

标签: spring-boot jooq


【解决方案1】:

看起来像https://github.com/jOOQ/jOOQ/issues/11762,已针对 3.15.0 和 3.14.9 进行了修复,即将发布。您可以尝试从 github 构建 3.14.9 或使用此处的快照构建:https://www.jooq.org/download/versions 如果您获得许可,看看是否能解决您的问题。

或者,您可以尝试使用 the fixed version of the DefaultConverterProvider 并在您的 Configuration 中使用它。

由于它与 2.3.9.RELEASE 一起使用,我想知道 Spring Boot 或 Jooq 发生了什么变化,现在会导致这种不同的行为吗?

通常,Spring Boot 升级伴随着 jOOQ 升级。您还可以将您的 jOOQ 依赖项降级为您之前在 Spring Boot 2.3.9 中使用的内容

【讨论】:

  • 我在我的配置类中使用了固定版本,解决了这个问题。谢谢。
  • @BluE:很高兴听到这解决了您的问题。我们将确保在未来对您绑定子类的特殊情况进行回归测试。
猜你喜欢
  • 2022-11-22
  • 2014-04-07
  • 2016-09-30
  • 2018-05-26
  • 2021-02-10
  • 2019-01-12
  • 2023-03-26
  • 1970-01-01
  • 2018-04-13
相关资源
最近更新 更多