【问题标题】:Jackson requires @JsonSubTypes-property on concrete class in JAX-RS endpointJackson 在 JAX-RS 端点的具体类上需要 @JsonSubTypes-property
【发布时间】:2021-07-04 04:50:20
【问题描述】:

我有多个 JAX-RS 端点,它们原则上工作并且是可访问的,需要 Java DTO 形式的不同参数。 这些 DTO 的结构如下:

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "jsonTypeInfo")
@JsonSubTypes({
        @JsonSubTypes.Type(value = com.company.package.ChildDto.class, name = "ChildDto"),
})
public class ParentDto...

子 DTO:

public class ChildDto extends ParentDto...

另一个 DTO 直接使用子 DTO 作为属性

public class OtherDto {
    private ChildDto childDtoRef;
    // getters and setters

端点方法如下所示

@POST
@Path("/my-path")
public void methodName(OtherDto otherDto) {

请注意,这两个 DTO 都没有标记为抽象的(如果 IMO 没有区别),并且通过使用 OtherDto,端点直接使用 ChildDto,而不是 ParentDto 类。如果 "jsonTypeInfo": "ChildDto" 是请求正文的一部分,则端点工作。但是,在这种情况下,它应该不是必需的,因为无论如何该方法只接受子类。

如果我在请求正文的 JSON 中省略 "jsonTypeInfo" 属性,我会收到以下异常:

com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple
type, class com...ChildDto]: missing type id property 'jsonTypeInfo' (for
POJO property 'childDtoRef')
at [Source: (io.undertow.servlet.spec.ServletInputStreamImpl); line: 8, column: 5] (through reference chain:
...

我在这里做错了吗?还是我的期望是 jsonTypeInfo 属性是不必要的,错了? Jackson 应该永远不需要解析 ParentDto 实例。

【问题讨论】:

    标签: java inheritance jackson mapping jax-rs


    【解决方案1】:

    我想不出一种方法来全局配置我想要的行为,而是找到了一种解决方法。在杰克逊回购的this site 上,它指出

    注解类型及其子类型的所有实例都使用这些设置 (除非被另一个注释覆盖)

    这意味着ChildDto 继承了相同的JsonTypeInfoJsonSubtypes 注释,同时还要求ID 属性jsonTypeInfo 存在。

    因此,解决方法是用相同的内容覆盖JsonTypeInfo 注释,但添加了defaultImpl,这是一个

    可用于指定默认实现的可选属性 如果类型标识符不是,则用于反序列化的类 目前 [...]

    具体来说,将以下注释添加到您的 ChildDto 类中:

    @JsonTypeInfo(
            use = JsonTypeInfo.Id.NAME,
            include = JsonTypeInfo.As.PROPERTY,
            property = "jsonTypeInfo",
            defaultImpl = ChildDto.class)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多