我目前正在尝试使用EclipseLink
、spring-data-jpa
和spring-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上找到。
1条答案
按热度按时间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
。