Исключение десериализации с Immutables и Hibernate vladmihalcea JSONB типа
Я использую Imm utables и Hibernate Types для сериализации объекта как jsonb
в PostgreSQL.
Моя сущность отображается так:
@Entity
@Table(schema = "data", name = "event")
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class Event {
@Id
@Column(name = "id")
private String id;
@Type(type = "jsonb")
@Column(name = "payload")
private Aggregate payload;
}
Aggregate
выглядит так:
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "aggregateType",
defaultImpl = GenericAggregate.class,
visible = true
)
@JsonSubTypes({
@Type(ConcreteAggregate.class)
})
public interface Aggregate {
}
И мой конкретный тип для Aggregate
:
@Value.Immutable
@JsonTypeName("concrete-aggregate")
@JsonSerialize(as = ImmutableConcreteAggregate.class)
@JsonDeserialize(as = ImmutableConcreteAggregate.class)
public interface ConcreteAggregate extends Aggregate {
// fields
}
Я получаю следующее исключение при чтении из базы данных:
java.lang.IllegalArgumentException: Class com.example.ConcreteAggregate not subtype of [simple type, class com.example.ConcreteAggregateBuilder$ImmutableConcreteAggregate]
at com.fasterxml.jackson.databind.type.TypeFactory.constructSpecializedType(TypeFactory.java:357)
at com.fasterxml.jackson.databind.jsontype.impl.TypeDeserializerBase._findDeserializer(TypeDeserializerBase.java:191)
at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:113)
at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:97)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithType(BeanDeserializerBase.java:1178)
at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:68)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004)
at com.vladmihalcea.hibernate.type.util.ObjectMapperWrapper.fromString(ObjectMapperWrapper.java:42)
at com.vladmihalcea.hibernate.type.util.ObjectMapperJsonSerializer.clone(ObjectMapperJsonSerializer.java:22)
at com.vladmihalcea.hibernate.type.util.ObjectMapperWrapper.clone(ObjectMapperWrapper.java:73)
at com.vladmihalcea.hibernate.type.json.internal.JsonTypeDescriptor$2.deepCopyNotNull(JsonTypeDescriptor.java:39)
Как я могу решить это?
1 ответ
TL;DR
Сделайте свой JSON DTO (интерфейс Aggregate
в этом случае) реализовать java.io.Serializable
,
Зачем?
Это исключение происходит потому, что Hibernate Types пытается клонировать объект в com.vladmihalcea.hibernate.type.util.ObjectMapperJsonSerializer
используя Джексона через ObjectMapper
если ваш класс не реализует java.io.Serializable
, Так что это просто вопрос реализации вашего JSON DTO java.io.Serializable
и это должно работать.