【发布时间】: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