Java从POJO生成XML追加对象时报错:找不到setUrl方法
问题排查:JAXB生成XML时的编译错误
期望生成的XML结构
<masterentitiy> <complete>1</complete> <srcsize>2</srcsize> <purl lang="en" format="for">url</purl> </masterentitiy>
现有POJO代码
MasterResponse类
@Data @XmlRootElement(name="masterentitiy") @XmlAccessorType (XmlAccessType.NONE) public class MasterResponse implements Serializable { @XmlElement private boolean complete; @XmlElement private Long srcsize; @XmlElement private List<Change> ch; }
Change类
@Getter @Setter public class Change implements Serializable { @XmlAttribute private String f; @XmlElement(name="purl") private String url; @XmlAttribute private String l; }
编译错误信息
java: cannot find symbol symbol: method setUrl(java.lang.String)
测试代码
Change sub = new Change() ; sub.setUrl("url"); sub.setLang("en"); sub.setFormat("for"); List<Change> com = new ArrayList<>(); com.add(sub); masterResponse.setSubtitles(com);
错误原因
- Setter方法名与属性不匹配:
- Change类定义的属性为
l、f,但测试代码中调用了不存在的setLang()、setFormat(),Lombok生成的正确Setter是setL()、setF(); - MasterResponse类的属性为
ch,测试代码中调用了不存在的setSubtitles(),正确Setter是setCh()。
- Change类定义的属性为
- Lombok注解未生效:
若setUrl()方法找不到,大概率是Lombok的@Setter注解未生效,可能是项目未引入Lombok依赖、IDE未安装Lombok插件,或未开启注解处理。 - JAXB映射与期望结构不符:
当前映射会让<purl>嵌套在<ch>节点下,无法直接作为<masterentitiy>的子节点,不符合期望结构。
解决方案
1. 修正测试代码的Setter调用
使用Lombok生成的正确方法名:
Change sub = new Change(); sub.setUrl("url"); sub.setL("en"); sub.setF("for"); List<Change> com = new ArrayList<>(); com.add(sub); masterResponse.setCh(com);
2. 确保Lombok正常生效
- 添加Maven依赖:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <scope>provided</scope> </dependency> - IDE配置:安装Lombok插件,并开启注解处理(如IntelliJ IDEA需在
Settings > Build, Execution, Deployment > Compiler > Annotation Processors中勾选Enable annotation processing)。
3. 调整JAXB映射以匹配期望XML结构
修改POJO的注解配置,让生成的XML结构完全符合需求:
// MasterResponse类修改 @Data @XmlRootElement(name="masterentitiy") @XmlAccessorType(XmlAccessType.NONE) public class MasterResponse implements Serializable { @XmlElement private boolean complete; @XmlElement private Long srcsize; // 指定每个Change对象生成<purl>节点 @XmlElement(name = "purl") private List<Change> ch; } // Change类修改,属性名与XML属性对应,文本内容用@XmlValue映射 @Getter @Setter public class Change implements Serializable { @XmlAttribute(name = "format") private String format; @XmlValue private String url; @XmlAttribute(name = "lang") private String lang; }
修改后的测试代码可以更直观:
Change sub = new Change(); sub.setUrl("url"); sub.setLang("en"); sub.setFormat("for"); List<Change> com = new ArrayList<>(); com.add(sub); masterResponse.setCh(com);
此时生成的XML将完全匹配期望结构。
内容的提问来源于stack exchange,提问作者Mohit H
相关产品推荐
相关产品推荐

