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

使用Lombok时JAXB Schemagen忽略@XmlAttribute的问题求助

问题解决:Lombok + JAXB Schema生成忽略@XmlAttribute字段

问题场景

使用Lombok的@Getter/@Setter注解时,JAXB序列化/反序列化MyEvent类一切正常,但生成XSD Schema时,标注了@XmlAttribute的字段被完全忽略;手动编写getter/setter方法后,Schema生成恢复正常。

解决方案

方案1:通过Lombok的onMethod参数将注解绑定到生成的getter方法

将字段上的@XmlAttribute注解移至Lombok@Getter的onMethod_参数中,让Lombok在生成getter方法时自动带上该注解:

@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "myEvent")
@SuperBuilder()
@NoArgsConstructor
@Setter
public class MyEvent extends SomeBaseClass {
    @Getter(onMethod_ = {@XmlAttribute(required = true)})
    private long processId;
    
    @Getter(onMethod_ = {@XmlAttribute(required = false)})
    private Long groupId;
}

这样JAXB的Schema生成工具能识别到getter方法上的@XmlAttribute注解,生成包含XML属性的正确Schema,同时不影响序列化/反序列化功能。

方案2:切换JAXB访问类型为字段级

将@XmlAccessorType改为XmlAccessType.FIELD,让JAXB直接处理字段上的注解,无需依赖getter方法:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "myEvent")
@SuperBuilder()
@NoArgsConstructor
@Getter
@Setter
public class MyEvent extends SomeBaseClass {
    @XmlAttribute(required = true)
    private long processId;
    
    @XmlAttribute(required = false)
    private Long groupId;
}

此方式下,Schema生成工具会直接读取字段上的注解,生成符合预期的Schema。如果父类SomeBaseClass中有不需要序列化的字段,需给这些字段添加@XmlTransient注解排除。

原因说明

JAXB的Schema生成机制与运行时序列化逻辑存在差异:

  • 运行时序列化时,XmlAccessType.NONE模式下JAXB可直接识别字段上的注解,Lombok生成的getter不影响功能。
  • 但Schema生成工具在XmlAccessType.NONE模式下,要求注解必须标注在可访问的getter方法上,而Lombok默认不会将字段注解复制到生成的方法上,导致字段被忽略。

内容的提问来源于stack exchange,提问作者k31

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:54:23