You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XmlMapper序列化XML时如何将@XmlAttribute字段转为元素属性而非子元素

当前问题是Jackson XML序列化默认不识别JAXB规范的@XmlAttribute注解,因此会将所有字段默认序列化为子元素而非属性。你可以选择以下两种方案解决:

方案1:启用JAXB注解支持(适配XSD自动生成的类,无需修改实体代码)

如果你的类是XSD自动生成的,不建议手动修改实体,通过注册JAXB注解支持模块即可:

  1. 新增JAXB注解模块依赖,版本与当前jackson-dataformat-xml保持一致:
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-jaxb-annotations</artifactId>
    <version>2.10.3</version>
</dependency>
  1. 修改XmlMapper配置,注册该模块:
final XmlMapper objectMapper = XmlMapper.builder()
        .defaultUseWrapper(false)
        // 注册JAXB注解支持,识别@XmlAttribute等JAXB注解
        .addModule(new JaxbAnnotationModule())
        .build();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"));
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

方案2:使用Jackson XML原生注解(可手动修改实体类时使用)

如果可以调整实体类代码,直接给需要序列化为属性的字段加Jackson原生注解即可,无需新增依赖:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "messageCreatedOn")
public class MessageCreatedOn {

    @XmlAttribute(name = "value", required = true)
    @XmlSchemaType(name = "dateTime")
    // 指定该字段序列化为XML属性
    @JacksonXmlProperty(isAttribute = true, localName = "value")
    protected XMLGregorianCalendar value;
    
    // 其余代码保持不变
}

两种方案任选其一即可得到你期望的输出格式。

内容的提问来源于stack exchange,提问作者D.Tomov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:57:03