我目前正在尝试使用eclipselink
,spring-data-jpa
和spring-data-rest
的方案,其中我有Embeddable
类继承。
方案相当简单:Parent
包含的值可以是PercentageValue
或AbsoluteValue
。
映射:
Person
包含可嵌入的值:
@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定制器我可以使用embeddables继承,但是由于类型信息,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
上找到