Spring Boot中Jackson解析具体类型字段时无需@type的配置咨询
嗨,这个问题我之前也碰到过!核心原因其实是你在父类TypeDTO上添加的@JsonTypeInfo注解是会被子类继承的——哪怕你在ClassUsingSubtype里声明的是具体的SubtypeDTO类型,Jackson还是会遵循父类的类型校验规则,要求你传入@type标识。
给你几个可行的解决方案,你可以根据自己的场景选择:
给
ClassUsingSubtype的具体字段单独关闭类型校验
直接在dto字段上添加@JsonTypeInfo(use = JsonTypeInfo.Id.NONE),明确告诉Jackson这个字段不需要类型标识:public class ClassUsingSubtype { @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) private SubtypeDTO dto; // 构造器、getter、setter 保持不变 }这个方法的好处是只影响这一个字段,不会干扰其他地方(比如
ClassUsingType里的TypeDTO字段仍然可以正常使用@type标识)。在子类
SubtypeDTO上显式覆盖类型信息配置
如果你这个子类在大多数场景下都是作为具体类型被使用的,可以直接在SubtypeDTO上添加注解关闭类型校验:@JsonTypeInfo(use = JsonTypeInfo.Id.NONE) public class SubtypeDTO extends TypeDTO { private String field; // 构造器、getter、setter 保持不变 }注意哦,这样设置后,如果你在其他地方用
TypeDTO类型引用SubtypeDTO(比如ClassUsingType里的字段),就必须确保那里的场景不需要类型标识,或者你再单独给那个字段配置回来。不推荐的全局配置
虽然可以通过全局Jackson配置关闭类型信息要求,但这样会影响所有继承了@JsonTypeInfo的类,比如ClassUsingType里的TypeDTO字段就无法正常解析带@type的JSON了,所以除非你确定整个项目都不需要类型标识,否则别用这个方法。
修改完成后,你原来的JSON{"dto": {"field": "value"}}就能正常被接口解析,不会再返回400错误啦!
内容来源于stack exchange

