如何将Object转换为JAXBElement<Object>?WebService请求参数设置疑问
如何将自定义Object转换为JAXBElement用于WebService请求
别担心,这个问题其实挺常见的,我来一步步教你怎么搞定。JAXBElement主要是用来处理XML元素的名称、命名空间这些元数据,尤其是当你的对象可能对应多个XML元素,或者需要明确指定XML元素信息的时候。
方法一:使用JAXB自动生成的ObjectFactory(推荐)
如果你是通过WSDL生成的WebService客户端代码,通常会自动生成一个ObjectFactory类,里面已经为每个需要的JAXBElement封装好了创建方法。比如假设你的对象类型是MyRequestObject,对应的XML元素是{http://your.namespace}myRequest,那ObjectFactory里大概率会有类似这样的方法:
public JAXBElement<MyRequestObject> createMyRequest(MyRequestObject value) { return new JAXBElement<MyRequestObject>(new QName("http://your.namespace", "myRequest"), MyRequestObject.class, value); }
你只需要实例化这个工厂类,然后把你的对象传进去就行:
// 先初始化并配置你的自定义对象 MyRequestObject myObj = new MyRequestObject(); myObj.setXXX("参数值"); // 通过ObjectFactory生成JAXBElement ObjectFactory factory = new ObjectFactory(); JAXBElement<MyRequestObject> jaxbElement = factory.createMyRequest(myObj);
这样得到的JAXBElement就可以直接用来设置WebService的请求参数了。
方法二:手动创建JAXBElement
如果没有自动生成的ObjectFactory,或者你需要自定义XML元素的元数据,那可以手动实例化JAXBElement。需要三个核心参数:
- QName:指定XML元素的命名空间和本地名称
- 元素类型:你的自定义Object的Class对象
- 实际对象实例:你要转换的那个Object
代码示例如下:
// 定义XML元素的命名空间和本地名称,要和WebService接口定义一致 QName elementQName = new QName("http://your.target.namespace", "requestElementName"); // 初始化并配置你的自定义对象 MyRequestObject myObj = new MyRequestObject(); // 手动构建JAXBElement JAXBElement<MyRequestObject> jaxbElement = new JAXBElement<>(elementQName, MyRequestObject.class, myObj);
这里要注意,QName的命名空间必须和WebService服务端定义的完全匹配,否则服务端可能无法识别你的请求。
额外小提示
- 如果你不确定QName的具体值,可以去查看WebService的WSDL文档,找到对应请求元素的命名空间和名称;或者查看生成的Java类上的
@XmlRootElement注解,里面的namespace和name属性就是你需要的QName参数。 - 部分WebService框架(比如CXF)在调用时,如果你的对象已经带有
@XmlRootElement注解,可能不需要手动转换为JAXBElement,但如果接口明确要求传入JAXBElement,上面的方法就完全适用。
内容的提问来源于stack exchange,提问作者Murilo Góes de Almeida
相关产品推荐
相关产品推荐

