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 + "]"; } }
问题分析与修复方案
- 根元素名称错误
实际生成的根元素为ResponseBean,但代码中已配置@XmlRootElement(name = "response"),需确保JAXB上下文初始化时传入ResponseBean.class:
JAXBContext context = JAXBContext.newInstance(ResponseBean.class);
同时排查项目中是否存在同名类或注解冲突。
- 嵌套
<var>标签问题
实际XML出现两层<var>,是因为集合属性默认会被JAXB包装在同名标签内。修改ResponseBean的getVar()注解,移除外层包装:
@XmlElementWrapper(name = "") // 空字符串表示不生成外层包装标签 @XmlElement(name = "var") public ArrayList<VarBean> getVar() { return this.var; }
- VarBean属性未转为XML属性
实际XML中name和value是子标签而非属性,需检查:
- 确保JAXB上下文能识别
VarBean(因ResponseBean引用了VarBean,通常JAXB会自动处理); - 确认
@XmlAttribute注解导入的是javax.xml.bind.annotation.XmlAttribute包。
- 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
相关产品推荐
相关产品推荐

