如何用JAXB在WSGRequest类中包装Address类以生成目标XML?
我来帮你搞定这个JAXB序列化的问题,要生成你要的目标XML结构,咱们需要做几个关键调整,一步步来:
1. 给WSGRequest添加Address属性并配置正确注解
你之前的WSGRequest里没有Address字段,首先得把它加进去。注意**@XmlElementWrapper是用来包装集合类型(比如List
)的**,你这里是单个Address对象,直接用@XmlElement就可以指定它的XML元素名:@XmlRootElement(name="v41:request") public class WSGRequest { // 保留原来的所有字段和方法... private Address address; // 新增Address字段 // 新增getter和setter,加上注解 @XmlElement(name = "v41:address") public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } // 更新构造方法,支持传入Address(可选,方便初始化) public WSGRequest(String ispId, String returnSpeekAtNok, String basisContrEleId, String contrEleId, String bbType, String dnType, String qualifExtRef, String correlationId, Address address) { setIspId(ispId); setReturnSpeekAtNok(returnSpeekAtNok); setBasisContrEleId(basisContrEleId); setContrEleId(contrEleId); setBbType(bbType); setDnType(dnType); setQualifExtRef(qualifExtRef); setCorrelationid(correlationId); setAddress(address); } // 保留无参构造方法... }
2. 创建顶层包装类对应最外层的v41:srvQualifByAddress
目标XML的根元素是<v41:srvQualifByAddress>,所以咱们需要一个专门的类来作为JAXB的根,包裹WSGRequest:
@XmlRootElement(name = "v41:srvQualifByAddress") public class SrvQualifByAddress { private WSGRequest request; @XmlElement(name = "v41:request") public WSGRequest getRequest() { return request; } public void setRequest(WSGRequest request) { this.request = request; } }
3. (可选但推荐)统一配置命名空间
现在每个元素都手动写v41:前缀,其实可以在包级别统一配置命名空间,让代码更整洁。在你的类所在的包下创建package-info.java文件:
@XmlSchema( namespace = "http://your-actual-namespace-url", // 替换成v41对应的真实命名空间URL elementFormDefault = XmlNsForm.QUALIFIED, xmlns = { @XmlNs(prefix = "v41", namespaceURI = "http://your-actual-namespace-url") } ) package com.your.package.name; // 替换成你的实际包名 import javax.xml.bind.annotation.XmlNs; import javax.xml.bind.annotation.XmlNsForm; import javax.xml.bind.annotation.XmlSchema;
配置后,你就可以把类里的name="v41:xxx"改成name="xxx",JAXB会自动加上v41前缀,代码更规范。
4. 修改Marshal方法,序列化顶层包装类
原来的方法只序列化WSGRequest,现在要改成序列化咱们新建的SrvQualifByAddress类:
public static String requestJaxObjectToXML(SrvQualifByAddress requestWrapper){ try{ JAXBContext jaxbContext = JAXBContext.newInstance(SrvQualifByAddress.class, WSGRequest.class, Address.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); StringWriter sw = new StringWriter(); jaxbMarshaller.marshal(requestWrapper, sw); String xmlContent = sw.toString(); return xmlContent; } catch(JAXBException e){ e.printStackTrace(); return "ERROR!"; } }
5. 测试代码(main方法)
现在可以构造Address、WSGRequest,再放到顶层包装类里生成XML:
public static void main(String[] args) { // 构造Address对象 Address address = new Address("Main St", "123", "10001", "New York"); // 构造带Address的WSGRequest WSGRequest request = new WSGRequest("100032", "true", "110", "100", "2", "1", "#myTicId", "test", address); // 放到顶层包装类里 SrvQualifByAddress wrapper = new SrvQualifByAddress(); wrapper.setRequest(request); // 生成XML String completeRequest = requestJaxObjectToXML(wrapper); System.out.println(completeRequest); }
运行后生成的XML就会完全符合你要的结构啦!
内容的提问来源于stack exchange,提问作者Natiic
相关产品推荐
相关产品推荐

