技术开发 频道

用SAAJ解决SOA集成问题

    首先,创建一个SOAP连接。SAAJ客户机可以利用SOAP Connection Factory,通过创建SOAPConnection来建立点到点的同步连接。该连接提供了同步调用服务的方法。接下来,将利用MessageFactory.newInstance()创建一个消息工厂的新实例。然后利用消息工厂的createMessage()方法创建一条SOAPMessage。这样就创建了一条没有内容的消息。

    SOAPMessage可以有一个SOAPPart,它包含XML SOAP消息和一个用于二进制/文本附件的AttachPart。通过调用消息的getSOAPPart()方法可以得到SOAPPart。利用消息的createAttachPart()方法可以创建附件部分。并且可以利用AttachPart的 setContent()方法设置附件。第1个参数是附件,第2个参数是内容类型。

    现在,要利用采用一个Source 对象的setContent()方法来设置SOAPPart的内容。该示例展示了用StringReader 和 StreamSource对象设置String中的内容的方法,但其源对象可以是任何东西。例如,如果您正在从文件中读取输入,则可以使用FileInputStream设置该内容。

    可以调用SOAPMessage 的saveChanges()方法,来保存对消息的更改。在调用连接的“call”方法时(这是下一步操作),这些更改也是被自动保存的。“call”方法把消息和端点作为参数(接受)。所有来自服务的同步响应将在SOAPMessage返回参数中返回。如果服务是异步服务,那么客户机应该忽略返回的SOAPMessage。

    最后,检查由服务返回的所有错误。调用close()方法关闭连接。所有SOAP级异常都将作为SOAPException被抛出。

    SOAP Fault处理

    SOAP规范定义了一个利用SOAP Fault将异常传回消费者的标准方法。虽然SOAP 1.1和SOAP1.2的SOAP Fault 结构存在很大的差异,但所有这些版本确实有一些通用元素。有关SOAP Fault的更多信息,请参阅 www.w3.org/TR/2003/REC-soap12-part1-20030624/#soapfault

    SAAJ提供了查找是否出现SOAP错误的API,并且如果出现SOAP错误,那么它将提供访问错误元素的方法,比如fault code、fault string、fault actor和fault detail元素。SOAPBody有以下这些方法:

    hasFault()——如果返回SOAP Fault,则返回true。
    getFault()——返回SOAPFault对象。
    SOAPFault有下面这些处理fault对象的方法:

    getFaultCode()——返回SOAP错误中的错误代码。
    getFaultString()——返回错误字符串。
    getFaultActor()——返回指出错误来源的错误操作符。
    getDetail()——返回fault detail元素。

    清单 1给出了出现错误时记录错误元素所在之处的一个示例。

    WebLogic Integration过程

    图1展示了Get Temperature的组合过程。该过程将下述的服务有机地结合在一起,从而获得某一给定城市和国家的温度:

    接收城市和州的位置信息,并将它放置在XML文档中。
    使用U.S. Zip Web服务(www.xmethods.net)获取具有给定名称的所有城市的邮政编码和所在州的列表。
    利用转换服务获取所提供的特定州中城市的邮政编码。
    调用天气-温度服务,获取该邮政编码区域的温度(www.xmethods.net)。
    将结果转换成位置输出文档,并返回它。
    合理处理所有异常。

     

    图 1.

    以上是 WebLogic Integration Get Temperature 的组合过程。

    清单 2展示了如何利用清单 1中给出的方法调用该服务。这个过程的端点URL是随输入的XML文档字符串一起传递给invokeService()方法的。

    清单 2. 以下是利用SAAJ调用WebLogic Integration过程的一个例子。

String inputXml = "<env:Envelope xmlns:env=
          \"http://schemas.xmlsoap.org/soap/envelope/\" " +
          "xmlns:soapenc=\"http://schemas.xmlsoap.org/soapencoding/\"
          xmlns:xsd=\"http://www.w3.org/001/XMLSchema\" " +
          "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
          <env:Header></env:Header>
          <env:Body> " + "<getTemp xmlns=\"http://www.openuri.org/\">" +  "<location xmlns=\"\">
                         <city>Barrington</city>
                         <state>IL</state>
                         </location>
                    </getTemp>" +  " </env:Body>
</env:Envelope> ";
invokeService("http://localhost:7001/saajService/processes/TempService.jpd",inputXml);

    SAAJ可能是SOA和集成领域中一种非常有用的API。SAAJ的一些应用程序包含测试框架的服务和服务调用的库。我们已经展示了如何利用SAAJ编写消费者,并创建了一个访问WebLogic Integration Get Temperature组合过程的示例客户机。将该示例应用到您自己的项目中,让SAAJ为您工作。

0
相关文章