@JsonTypeInfo和Spring Data Rest

时间:2016-08-04 10:08:44

标签: spring eclipselink spring-data-jpa spring-data-rest

我目前正在尝试使用eclipselinkspring-data-jpaspring-data-rest的方案,其中我有Embeddable类继承。

方案相当简单:Parent包含的值可以是PercentageValueAbsoluteValue

映射: 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

上找到

0 个答案:

没有答案