spring-data-jpa 带有Spring Data Rest的@JsonTypeInfo导致序列化错误

vuv7lop3  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(235)

我目前正在尝试使用EclipseLinkspring-data-jpaspring-data-rest的场景,其中我有带继承的Embeddable类。
情况相当简单:Parent包含的值可以是PercentageValue,也可以是AbsoluteValue
Map:Parent包含一个可嵌入的值:

@Entity
public class Parent {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Embedded
    private Value value;
}

Value是不同值的抽象超类

@Embeddable
@Customizer(Customizers.ValueCustomizer.class)
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type")
@JsonSubTypes({
        @Type(name="PERCENTAGE", value=PercentageValue.class),
        @Type(name="ABSOLUTE", value=AbsoluteValue.class)})
public abstract class Value {}

PercentageValue是具体Value实现的示例

@Embeddable
@Customizer(Customizers.PercentageValueCustomizer.class)
@JsonSerialize(as = PercentageValue.class)
public class PercentageValue extends Value {
    private BigDecimal percentageValue;
}

使用EclipseLink定制器,我可以使继承与可嵌入对象一起工作,但是spring-data-rest似乎不能序列化值对象,因为类型信息。
对父资源的GET请求会导致以下异常:
.w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Type id handling not implemented for type java.lang.Object (by serializer of type org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module$NestedEntitySerializer) (through reference chain: org.springframework.data.rest.webmvc.json.["content"]->com.example.Parent["value"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Type id handling not implemented for type java.lang.Object (by serializer of type org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module$NestedEntitySerializer) (through reference chain: org.springframework.data.rest.webmvc.json.["content"]->com.example.Parent["value"])
NestedEntitySerializer似乎没有实现com.fasterxml.jackson.databind.JsonSerializer#serializeWithType,而是退回到只抛出异常的标准实现。
如果我删除@JsonTypeInfo注解,序列化就可以工作,但是POST当然会失败,因为Jackson缺少正确反序列化所需的类型信息。
有什么想法吗?有没有办法让序列化与JsonTypeInfo一起工作?
完整的项目可以在GitHub上找到。

m528fe3b

m528fe3b1#

Spring Data REST在将数据序列化到REST输出时,在支持Jackson的@JsonTypeInfo方面有许多已记录的限制。
目前看来,@JsonTypeInfo(include=JsonTypeInfo.As.EXISTING_PROPERTY)可以正常工作(spring-data-rest#1242),但其他JsonTypeInfo.As类型不能正常工作(spring-data-rest#1269)。
应该可以将您的模型迁移为使用JsonTypeInfo.As.EXISTING_PROPERTY而不是JsonTypeInfo.As.PROPERTY

相关问题