Исключение десериализации с Immutables и Hibernate vladmihalcea JSONB типа - PullRequest
0 голосов
/ 04 декабря 2018

Я использую Immutables и Типы гибернации для сериализации объекта как 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 Ответ

0 голосов
/ 04 декабря 2018

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, и он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...