使用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
相关产品推荐
相关产品推荐

