【问题标题】:how to make child class deserialize without type property in Jackson while type specified in parent class在父类中指定类型时,如何使子类在 Jackson 中没有类型属性的情况下反序列化
【发布时间】:2021-01-04 09:41:36
【问题描述】:

我有一个服务接收我的父接口作为输入,以便接收不同类型的输入。 接口定义如下:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY)
@JsonSubTypes({
    @JsonSubTypes.Type(value = Person.class, name = "person"),
    @JsonSubTypes.Type(value = Employee.class , name = "employee")
})
public interface TestInterface {
}

我有一个服务可以获取 TestInterface 如下:

@RequestMapping(value="/convert", method = RequestMethod.POST)
@ResponseBody
public Person test(@RequestBody TestInterface object){}

此服务必须获得如下所示的 json,并且仅适用于具有 type 属性的文件:

 {"@type":"person","name":null,"family":"fami"}

问题是当我有一个直接接收子类的服务并且我不想指定类型属性时。

@RequestMapping(value="/convertPerson", method = RequestMethod.POST)
@ResponseBody
public Person test(@RequestBody Person object){}

在此示例中,当我不发送类型属性时,我得到(缺少类型 id 属性)异常。有没有办法让它在没有类型 ID 的情况下工作? 我已经尝试了以下配置,但没有解决问题:

spring.jackson.deserialization.fail-on-missing-external-type-id-property=false

【问题讨论】:

    标签: java spring-boot jackson


    【解决方案1】:

    通过将@JsonTypeInfo(use = JsonTypeInfo.Id.NONE) 放在子类之上解决了这个问题。有了这个注解,子类可以在没有类型的情况下独立工作,并且父接口也可以在类型上正常工作。

    @JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
    public class Person implements TestInterface{
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      相关资源
      最近更新 更多