读书人

JAVA6开发WebService (4)SAAJ调

发布时间: 2012-12-26 14:39:29 作者: rapoo

JAVA6开发WebService (四)——SAAJ调用WebService

??? 前面写了个JAX-WS的小例子,看到用JAVA6开发WebService确实很简单,也很方便,不过前面也说了,JAVA有三种WebService规范,JAX-WS是其中一种,现在来看看JAXM&SAAJ。

?

??? 最近在做一个接口平台的项目,接口嘛,当然得涉及到对WebService的接口了,我们计划做成一个通用的平台,通过配置文件进行配置后就可以动态对某一个接口进行调用,但像前面的例子那样,每次都要生成一堆客户端代码,这可受不了。如果调用的接口唯一,生成一次客户端代码当然没问题,但如果要调用的接口是动态的,这就不好办了。因此,我需要了解SOAP更多底层的细节,由我自己来组织SOAP中的内容而不是完全由代码生成器生成。

?

??? 仍使用前面例子中的服务器端:

接口:

Customer类:

?

??? 使用SAAJ创建附件时,需设置Content-Type=application/xop+xml; charset=utf-8; type="text/xml",否则服务器端获取不到这个附件,查看发送给服务器端的SOAP消息可以看到,默认Content-Type被置为text/xml; charset=utf-8,因此,需在代码中加入:

    <xs:sequence>
<xs:element name="item" type="tns:customer" minOccurs="0" maxOccurs="unbounded" nillable="true"/>
</xs:sequence>
</xs:complexType>
所以,在封装的时候,只要将其封装为
<arg0>
<item>
<Customer>...</Customer>
</item>
<item>
<Customer>...</Customer>
</item>
...
</arg0>
这样的层次结构就可以了。

对于集合,使用JDK自带的实现时,貌似不能直接传递,但可以变通一下:自定义一个bean,将要传递的list作为这个bean的属性就可以传递了,也就是说,对象内的list是可以传递的。
public class CustomerList{
private ArrayList list;
private HashMap map;
//get and set method
}
SOAP封装List或Map时类似这样的方式:
<list>aaa</list>
<list>bbb</list>
<map>
<entry>
<key>1</key>
<value>111</value>
</entry>
<entry>
<key>2</key>
<value>222</value>
</entry>
</map>
不过我觉得应该尽量避免使用这种特定语言的内置对象。
若使用其他实现,如CXF,可以直接传递,SOAP消息中封装方式与数组类似,不知道是JDK的BUG还是人家压根没考虑实现这种方式。

如果说的不对,还望大侠们指教啊!


读书人网 >Web前端

热点推荐