如何让XmlMapper自动解析密封接口实现类完成XML反序列化?
要让XmlMapper自动解析密封接口的实现类,不用写手动的判断逻辑,核心是用Jackson 2.12版本后支持的类型推导功能,具体操作如下:
1. 确认依赖版本
Jackson从2.12开始正式支持Java密封类/接口,同时新增了DEDUCTION类型推断模式,所以你的jackson-databind和jackson-dataformat-xml依赖版本必须≥2.12,否则无法使用该特性。
2. 给密封接口添加注解配置
在Child接口上添加两个注解:@JsonTypeInfo指定使用类型推导模式,@JsonSubTypes列出所有允许的实现类。修改后的代码如下:
public record Root(String id, Child child) { @JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION) @JsonSubTypes({ @JsonSubTypes.Type(ChildA.class), @JsonSubTypes.Type(ChildB.class), @JsonSubTypes.Type(ChildC.class) }) public sealed interface Child permits ChildA, ChildB, ChildC { String name(); public record ChildA(String name, int a) implements Child {} public record ChildB(String name, int a, int b) implements Child {} public record ChildC(String name, int c) implements Child {} } }
配置完成后,Jackson会自动根据XML中的字段匹配对应实现类:比如XML里只有name和c时,自动实例化ChildC;有name、a、b时自动用ChildB,完全适配你当前无歧义的场景。
3. 调整XmlMapper配置(可选)
虽然默认情况下USE_DEDUCTION_FOR_TYPE_DEFINITIONS特性是开启的,但可以在构建XmlMapper时明确配置,避免因环境差异导致失效:
XmlMapper xmlMapper = XmlMapper.builder() .addModule(/*你的Instant自定义反序列化模块*/) .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true) .configure(MapperFeature.USE_DEDUCTION_FOR_TYPE_DEFINITIONS, true) .build(); xmlMapper.setTimeZone(TimeZone.getTimeZone("UTC"));
4. 移除手动的@JsonCreator逻辑
完成上述配置后,之前写的静态creator方法就可以完全删除了,XmlMapper会自动完成实现类的匹配和对象实例化。
内容的提问来源于stack exchange,提问作者polo
相关产品推荐
相关产品推荐

