You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Jackson反序列化XML时未校验@JacksonXmlRootElement指定的根元素名称,如何实现根元素名验证?

Jackson反序列化XML时未校验@JacksonXmlRootElement指定的根元素名称,如何实现根元素名验证?

这个问题我之前也碰到过!默认情况下Jackson的XmlMapper确实不会校验根元素的名称——它只会把XML里的子元素映射到POJO的对应字段上,完全忽略根元素的名称是否匹配。要实现根元素名称的严格校验,只需要开启一个内置的反序列化特性就能解决。

解决方案步骤:

  1. 保留正确的POJO注解:你已经在Employee类上标注了@JacksonXmlRootElement(localName = "Employee"),这一步没问题,继续保留即可。
  2. 修改XmlMapper配置:在创建XmlMapper实例时,开启DeserializationFeature.UNWRAP_ROOT_VALUE特性。这个特性会让Jackson将根元素视为POJO的“包裹层”,从而校验其名称是否与@JacksonXmlRootElement指定的一致。

修改后的代码示例:

Main方法:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.nio.file.Files;
import java.nio.file.Path;

public class Main {
    public static void main(String[] args) throws Exception {
        // 配置XmlMapper并启用根元素校验特性
        XmlMapper mapper = XmlMapper.builder()
                .enable(DeserializationFeature.UNWRAP_ROOT_VALUE)
                .build();
        
        String xmlContent = Files.readString(Path.of("customer.xml"));
        try {
            Employee employee = mapper.readValue(xmlContent, Employee.class);
        } catch (Exception e) {
            // 根元素不匹配时会抛出异常,示例错误信息:
            // Root name 'Customer' does not match expected ('Employee') for type `Employee`
            e.printStackTrace();
        }
    }
}

原理说明:

Jackson XML模块默认忽略根元素名称,是为了兼容一些根元素不固定的XML场景。但当你开启UNWRAP_ROOT_VALUE后,Jackson会强制校验根元素名称:

  • 如果XML根元素名称与@JacksonXmlRootElementlocalName不一致,会直接抛出JsonMappingException
  • 若你的POJO没有标注@JacksonXmlRootElement,开启该特性后,Jackson会默认使用POJO类名的驼峰形式(比如employee)作为期望的根元素名称,因此建议始终显式标注注解来指定明确的根元素名。

你的Jackson版本(2.18.1)完全支持这个特性,不需要额外引入其他模块。


备注:内容来源于stack exchange,提问作者Danilo Piazzalunga

火山引擎 最新活动