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

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);

错误原因

  1. Setter方法名与属性不匹配:
    • Change类定义的属性为l、f,但测试代码中调用了不存在的setLang()、setFormat(),Lombok生成的正确Setter是setL()、setF();
    • MasterResponse类的属性为ch,测试代码中调用了不存在的setSubtitles(),正确Setter是setCh()。
  2. Lombok注解未生效:
    若setUrl()方法找不到,大概率是Lombok的@Setter注解未生效,可能是项目未引入Lombok依赖、IDE未安装Lombok插件,或未开启注解处理。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:35:32