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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:18:14