为何Jackson序列化时__type属性为null?已标注具体类型子类型信息
解决序列化时自动填充__type类型标识字段的问题
下面是针对你遇到的问题的排查和修复步骤:
1. 确认ObjectMapper的多态处理配置
Jackson要自动生成__type字段,得确保ObjectMapper没有禁用多态类型处理。如果是手动创建的ObjectMapper,添加以下配置:
ObjectMapper objectMapper = new ObjectMapper(); // 启用基于名称的多态类型解析 objectMapper.enableDefaultTyping(DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
如果是Spring环境,检查自定义的ObjectMapper Bean有没有意外覆盖默认的多态逻辑,避免禁用相关特性。
2. 验证BaseRequest的注解是否正确
仔细核对BaseRequest上的Jackson注解参数,不能出错:
@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, // 用名称作为类型标识 include = JsonTypeInfo.As.PROPERTY, // 作为属性写入JSON property = "__type", // 字段名必须与指定的__type一致 visible = true // 确保序列化时该字段可见 ) @JsonSubTypes({ @JsonSubTypes.Type(value = ConcreteRequest.class, name = "ConcreteRequest") // 类型名需完全匹配 }) public class BaseRequest { // 类内容 }
重点检查use是否为JsonTypeInfo.Id.NAME,property是否准确设置为__type,以及@JsonSubTypes中name的拼写、大小写是否和预期一致。
3. 给ConcreteRequest添加@JsonTypeName注解
直接序列化子类实例时,Jackson有时不会自动触发父类的多态配置,给ConcreteRequest加上@JsonTypeName注解可强制指定类型名:
@JsonTypeName("ConcreteRequest") public class ConcreteRequest extends BaseRequest { // 类内容 }
这样无论以父类还是子类类型序列化,都会自动写入__type字段。
4. 检查生成类的继承关系
确保OpenAPI的allOf配置正确,生成的ConcreteRequest确实继承了BaseRequest。如果继承关系错误,Jackson无法识别它是BaseRequest的子类,自然不会生成__type字段。
5. 核对openapi-generator-maven-plugin的配置
插件配置要确保使用jackson库,且未禁用注解生成:
<plugin> <groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>你的插件版本</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <inputSpec>${project.basedir}/src/main/resources/openapi.yaml</inputSpec> <generatorName>java</generatorName> <library>jackson</library> <!-- 必须指定jackson库,否则注解可能不符合要求 --> <configOptions> <dateLibrary>java8</dateLibrary> <!-- 其他必要配置 --> </configOptions> </configuration> </execution> </executions> </plugin>
如果使用旧版本插件,可能存在allOf生成继承关系的bug,建议升级到最新稳定版尝试。
内容的提问来源于stack exchange,提问作者juckky
相关产品推荐
相关产品推荐

