【发布时间】: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