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

Java ResponseBean返回XML格式异常,期望格式不符求助

解决JAXB生成XML格式不符问题

问题现状

从ResponseBean生成的XML与预期格式不符:

实际生成的XML

<ResponseBean>
    <var>
        <var>
            <name>isOp</name>
            <value>0</value>
        </var>
        <var>
            <name>callStartTime</name>
            <value>17-09-2024 18:41:29</value>
        </var>
    </var>
</ResponseBean>

期望的XML格式

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
<var value="1" name="isOp"/>
<var value="25-07-2024 18:48:44" name="callStartTime"/>
</response>

现有代码

ResponseBean类

package com.portal.dto;

import java.util.ArrayList;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "response")
public class ResponseBean {

    private ArrayList<VarBean> var = new ArrayList<>();  // Initialize to avoid null issues
    
    public ResponseBean() {
    }
    
    public ResponseBean(ArrayList<VarBean> var) {
        this.var = var;
    }
    
    @XmlElement(name = "var")  // Annotate getter to ensure the proper XML output
    public ArrayList<VarBean> getVar() {
        return this.var;
    }
    
    public void setVar(ArrayList<VarBean> var) {
        this.var = var;
    }
    
    @Override
    public String toString() {
        return "ResponseBean [var=" + var + "]";
    }
}

VarBean类

package com.portal.dto;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "var")

public class VarBean {

    private String name;
    private String value;
    
    public VarBean() { 
    }
    
    public VarBean(String name, String value) {
        this.name = name;
        this.value = value;
    }
    
    public VarBean(String name, int value) {
        this.name = name;
        this.value = String.valueOf(value);  
    }
    
    @XmlAttribute
    public String getName() {
        return this.name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    @XmlAttribute
    public String getValue() {
        return this.value;
    }
    
    public void setValue(String value) {
        this.value = value;
    }
    
    @Override
    public String toString() {
        return "VarBean [name=" + name + ", value=" + value + "]";
    }

}

问题分析与修复方案

  1. 根元素名称错误
    实际生成的根元素为ResponseBean,但代码中已配置@XmlRootElement(name = "response"),需确保JAXB上下文初始化时传入ResponseBean.class:
JAXBContext context = JAXBContext.newInstance(ResponseBean.class);

同时排查项目中是否存在同名类或注解冲突。

  1. 嵌套<var>标签问题
    实际XML出现两层<var>,是因为集合属性默认会被JAXB包装在同名标签内。修改ResponseBean的getVar()注解,移除外层包装:
@XmlElementWrapper(name = "") // 空字符串表示不生成外层包装标签
@XmlElement(name = "var")
public ArrayList<VarBean> getVar() {
    return this.var;
}
  1. VarBean属性未转为XML属性
    实际XML中name和value是子标签而非属性,需检查:
  • 确保JAXB上下文能识别VarBean(因ResponseBean引用了VarBean,通常JAXB会自动处理);
  • 确认@XmlAttribute注解导入的是javax.xml.bind.annotation.XmlAttribute包。
  1. XML声明缺失
    需在Marshaller中配置输出XML声明:
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false); // 输出XML声明
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

修复后的代码示例

修改后的ResponseBean

package com.portal.dto;

import java.util.ArrayList;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "response")
public class ResponseBean {

    private ArrayList<VarBean> var = new ArrayList<>();

    public ResponseBean() {
    }

    public ResponseBean(ArrayList<VarBean> var) {
        this.var = var;
    }

    @XmlElementWrapper(name = "")
    @XmlElement(name = "var")
    public ArrayList<VarBean> getVar() {
        return this.var;
    }

    public void setVar(ArrayList<VarBean> var) {
        this.var = var;
    }

    @Override
    public String toString() {
        return "ResponseBean [var=" + var + "]";
    }
}

正确的Marshaller配置

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;

public class XmlGenerator {
    public static void main(String[] args) throws JAXBException {
        // 构造测试数据
        VarBean isOpVar = new VarBean("isOp", "1");
        VarBean startTimeVar = new VarBean("callStartTime", "25-07-2024 18:48:44");
        ArrayList<VarBean> vars = new ArrayList<>();
        vars.add(isOpVar);
        vars.add(startTimeVar);
        ResponseBean response = new ResponseBean(vars);

        // 初始化JAXB上下文
        JAXBContext context = JAXBContext.newInstance(ResponseBean.class);
        Marshaller marshaller = context.createMarshaller();
        
        // 配置输出属性
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

        // 生成XML
        StringWriter writer = new StringWriter();
        marshaller.marshal(response, writer);
        System.out.println(writer.toString());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:17:37