XmlMapper序列化XML时如何将@XmlAttribute字段转为元素属性而非子元素
当前问题是Jackson XML序列化默认不识别JAXB规范的@XmlAttribute注解,因此会将所有字段默认序列化为子元素而非属性。你可以选择以下两种方案解决:
方案1:启用JAXB注解支持(适配XSD自动生成的类,无需修改实体代码)
如果你的类是XSD自动生成的,不建议手动修改实体,通过注册JAXB注解支持模块即可:
- 新增JAXB注解模块依赖,版本与当前jackson-dataformat-xml保持一致:
<dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>2.10.3</version> </dependency>
- 修改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
相关产品推荐
相关产品推荐

