• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統計

            最新評論

            使用SAAJ 和JAXM的 SOAP客戶端及服務 --- 轉自http://oss.org.cn/ossdocs/one_and_net/app7/12.1.htm

            本模塊講述了如何使用用于JavaTM 的帶附件的SOAP(SAAJ)和用于XML消息的Java TM API(JAXM)創建能夠發送和接收消息的客戶端,以及如何部署它們到Sun ONE Application Server上。本模塊包括以下幾節:

            SOAP客戶端


            本節講述了SOAP客戶端可以采用的兩種消息模型以及開發和部署這類客戶端的過程。本節包括以下主題:

            SOAP客戶端消息模型

            可以使用以下兩種消息模型建立SOAP客戶端

            沒有消息提供者的客戶端

            不使用消息提供者的應用程序只能交換同步消息。也就是說,扮演客戶端角色的應用程序只能發送請求-響應消息。這種類型的客戶端采用SAAJ API的SOAPConnection方法。下圖演示了在沒有消息提供者的情況下,同步消息如何在發送者和接收者之間交換。

            不使用消息提供者的SOAP消息


            不使用消息提供者的客戶端具有以下優點:

            • 可以采用J2SE平臺編寫應用程序。
            • 不需要在servlet或J2EE容器中部署應用程序。
            • 不需要配置消息提供者。

            不使用消息提供者的客戶端具有以下局限性:

            • 客戶端只能發送請求-響應消息
            • 客戶端只能扮演客戶端角色

            使用消息提供者的客戶端

            如果想要獲得并且保存在任何時間發送給你的請求,你必須使用消息提供者。JAXM API提供了使用消息提供者發送和接收消息的框架。你需要在容器中運行客戶端,容器提供了消息基礎結構讓提供者使用。下圖演示了在使用消息提供者的情況 下,異步消息如何在發送者和接收者之間交換。

            使用消息提供者的SOAP消息


            使用消息提供者的客戶端具有以下優點:

            • 客戶端能夠扮演客戶端或者服務角色
            • 客戶端能夠切換消息傳遞給提供者
            • 在客戶端傳遞消息到最終接收者之前,它能夠發送消息到一個或多個目的地。這些中間的消息接收者被稱為actor,它們在消息的SOAPHeader對象中被指定。
            • 客戶端能夠利用任何提供者支持的SOAP消息協議和影響消息類型與可靠性的‘服務質量’,以及消息傳遞服務的質量。

            注意

            Sun ONE Application Server包含了一個示例JAXM提供者,它演示了如何使用提供者為發送客戶端激活“發后不理(fire and forget)”消息。請察看示例文檔獲取關于如何激活、部署和使用它的全面信息。示例應用程序可以從以下位置得到:

            install_dir/samples/webservices/jaxm/jaxm-provider/

            Sun ONE Application Server的未來版本將會包括支持可靠SOAP消息和ebXML消息的JAXM提供者。


            SOAP消息

            本節向你介紹SOAP消息的結構和組成部分、如何訪問它們、以及如何處理SOAP消息。本節講述以下主題:

            SOAP消息的組成部分

            SOAP消息是一個包括SOAPEnvelope、一個可選的SOAPHeader、以及SOAPBody的XML文件。SOAP消息頭包含了使消息在到達最終目的地之前,能夠被路由到一個或多個中間節點的信息。

              SOAP消息的組成部分

            這個圖展示了SOAP消息的結構和組成部分。不同對象代表了SOAP消息的每一個部分。

            SOAPMessage對象包括:

            • 一個SOAPPart對象,其中包括
              • 一個SOAPEnvelope對象,其中包括
                • 一個空的SOAPHeader對象 – 可選,包括它是為了方便,因為大多數消息都要用到它。
                • 一個空的SOAPBody對象 -可以容納消息的內容,還能容納包含了狀態信息或者消息故障明細的錯誤消息。
            • AttachmentPart可能容納普通文本或者圖像文件。

            SOAPEnvelope是代表消息的XML文件的根元素。它為消息如何處理、由誰處理定義了框架。XML內容從SOAPEnvelope開始。

            SOAPHeader是添加特性到SOAP消息的基本機制。它可以容納任意數目的擴展了基礎協議 的子元素。例如,header子元素可能會定義認證信息、事務信息、本地信息、等等。處理消息的軟件可以在沒有事先約定的情況下,使用這個機制定義誰應該 處理某個特性,以及該特性是強制的還是可選的。

            body是發給消息最終接收者的強制信息的容器。SOAP消息還可以容納一個附件,它不一定非得是XML文件。

            訪問消息的元素

            當創建消息體或附件的時候,以及處理消息的時候,你需要訪問消息的組成部分。

            SOAPMessage對象含有一個SOAPPart對象。通過message對象可以得到它。

            SOAPPart soapPart = message.getSOAPPart();

            然后你可以利用SOAPPart獲得它所含有的SOAPEnvelope對象。

            SOAPEnvelope envelope = soapPart.getEnvelope();

            現在你可以利用envelope獲得它的空SOAPHeader和SOAPBody對象。

            SOAPHeader header = envelope.getHeader();

            SOAPBody body = envelope.getBody();

            SOAPBody對象最初是空的。

            命名空間

            XML命名空間是一種限定元素和屬性名稱的方法,目的是消除它們與同一文件中其他名稱之間產生的歧義。一個名確的XML命名空間聲明采用如下格式:

            <prefix:myElement

            xmlns:prefix ="URI">

            聲明定義prefix作為一個特定URI的別名。在myElement元素內,你可以對任何元素或屬性使用前綴,從而指定元素或屬性屬于URI指定的命名空間。下面的代碼是命名空間聲明的一個例子。

            <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

            該定義定義了SOAP_ENV作為命名空間http://schemas.xmlsoap.org/soap/envelope/

            的別名。

            定義了別名之后,可以使用它作為Envelope元素中任何屬性或元素的前綴。

            預定義的SOAP命名空間

            • SOAPEnvelope,SOAP消息的根元素,擁有下面的命名空間標識http://schemas.xmlsoap.org/soap/envelope
            • SOAP serialization,定義SOAP序列化規則的URI,擁有下面的命名空間標識"http://schemas.xmlsoap.org/soap/encoding".。

            當使用SAAJ或JAXM構造或者消費消息的時候,你有責任保證正確設定或處理命名空間,并且丟棄含有錯誤命名空間的消息。

            創建SOAP消息的時候使用命名空間

            當創建SOAP消息的body或header元素的時候,你必須使用命名空間為元素指定一個完整的名稱。通過調用方法SOAPEnvelope.createName可以獲得一個名稱。

            調用該方法時,可以傳遞一個本地名稱作為參數,或者可以指定本地名稱、前綴、以及URI。例如,下面的命令行定義了一個名為bodyName的Name對象。

            Name bodyName = MyEnvelope.createName("TradePrice", "GetLTP", "http://foo.eztrade.com");

            這和下面的命名空間聲明作用相同。

            <GetLTP:TradePrice xmlns:GetLTP= "http://foo.eztrade.com">

            下面的代碼演示了如何創建一個名稱并把它和SOAPBody元素綁定。注意createName方法的使用和位置。

            SoapBody body = envelope.getBody();//get body from envelope

            Name bodyName = envelope.createName("TradePrice", "GetLTP", "http://foo.eztrade.com");

            SOAPBodyElement gltp = body.addBodyElement(bodyName);

            開發SOAP客戶端

            利用SAAJ,客戶端能夠以點對點的方式創建并且發送SOAP消息。JAXM為使用消息提供者的 XML消息定義了API。JAXM依賴用于 Java 的帶有附件的 SOAP API(SAAJ),它定義了在Java中操作帶有附件的SOAP消息模型的API。Sun ONE Application Server不包括它所支持的JAXM消息提供者。然而它的確包含了示例應用程序,一個簡單的JAXM提供者,演示了一個消息提供者如何處理來自客戶端的 異步SOAP消息。本節講述以下主題:

            SOAP消息是如何出現的?

            當消息工廠生產的SOAP消息通過連接被發送到一個端點的時候,SOAP消息就出現了。本節講述以下主題:

            端點

            端點標識消息的最終目的地。端點是由URLEndpoint類來定義的。如果不使用提供者,你可以構造或者查找到一個消息端點。

            構造端點

            你可以通過調用構造函數或者在名稱服務中查找來初始化一個端點。

            以下代碼使用構造函數創建一個URLEndpoint:

            myEndpoint = new URLEndpoint("http://host/myServlet")

            使用端點發送消息

            指定端點作為SOAPConnection.call方法的一個參數,該方法是用來發送SOAP消息的。

            向多個端點發送消息

            管理對象是封裝了針對提供者的配置和命名信息的對象。如果使用管理對象定義端點,需要注意的是:可以把該管理對象綁定到多個URL——每個URL都能夠處理到達的SOAP消息。

            以下代碼示例把lookup名稱為myEndpoint的端點綁定到兩個URL:http://www.myServlet1/

            和 http://www.myServlet2/。這個語法允許你使用SOAP連接發布SOAP消息到多個端點。

            imqobjmgr add
               -t e
               -l "cn=myEndpoint"
               -o "imqSOAPEndpointList=http://www.myServlet1/
                  http://www.myServlet2/"

            連接

            想要利用SAAJ或JAXM發送SOAP消息,必須分別獲得一個SOAPConnection 或ProviderConnection。你還可以使用消息隊列傳輸消息;更多信息請參見Sun ONE消息隊列開發人員指南。

            SOAP 連接

            SOAPConnection允許你直接向遠程伙伴發送消息。通過調用靜態方法SOAPConnectionFactory.newInstance(),可以容易地得到SOAPConnection對象。這種類型的連接既不保證可靠性也不保證安全性。

            提供者連接

            從ProviderConnectionFactory 獲得的ProviderConnection可以創建到特定消息提供者的連接。當使用提供者發送SOAP消息的時候,消息被傳遞給提供者,然后提供者負責 傳遞消息到它的最終目的地,這樣保證了可靠并且安全的消息傳輸。

            創建SOAP客戶端

            創建SOAP客戶端之前,確定你已經設置了客戶端環境。關于設置客戶端環境的更多信息,請參見。

            如果創建一個點對點客戶端,你必須導入SAAJ API的javax.xml.soap程序包。如果創建一個pub/sub客戶端,需要導入import JAXM API的javax.xml.messaging程序包。除此之外,你還必須導入以下程序包:

            import java.net.*;
            import java.io.*;
            import java.util.*;

            import javax.servlet.http.*;
            import javax.servlet.*;

            import javax.activation.*;
            import javax.naming.*;

            創建SOAP客戶端并訪問消息包括以下步驟:

            獲得連接

            單獨客戶端

            不使用消息提供者的客戶端使用SOAPConnection對象創建連接。使用SoapConnection對象發送的消息直接從發送者到發送者指定的URL。

            必須獲得一個SOAPConnectionFactory對象來創建連接。SAAJ API通過提供SOAPConnectionFactory類的一個默認實現簡化了這一過程。以下代碼演示了如何獲得該實現的一個實例:

            SOAPConnectionFactory scf = SOAPConnectionFactory. newInstance();

            現在,你可以使用scFactory創建SOAPConnection對象

            SOAPConnection con = scf.createConnection();

            創建消息

            使用MessageFactory對象來創建消息。如果想要創建一個單獨客戶端,也就是既不使用消息提供者也不在容器中運行的客戶端,你可以使用SAAJ API提供的MessageFactory類的實現。以下代碼演示了如何獲得默認消息工廠的一個實例,然后用它創建消息:

            MessageFactory mf = MessageFactory.newInstance();

            SOAPMessage msg = mf.createMessage();

            消息創建過程會完成SOAPPart的創建,它是SOAP 1.1規范中每個消息的必要部分。

            SOAPPart sp = msg.getSOAPPart();


            注意:

            通常,使用默認的消息工廠創建消息。但是,你也可以編寫自己的消息工廠實現,并且把它插入到系統屬性中,如下所示:

            • 通過擴展javax.xml.soap.MessageFactory實現消息工廠類。 javax.xml.soap是在SAAJ API中定義的程序包。
            • 通過設定系統屬性javax.xml.soap.MessageFactory為消息工廠實現類mypackage.MySOAPMessageFactoryImpl的完全路徑名,指定希望被實例化的消息工廠類。

            關于SOAP消息結構和組成部分的信息,請參見

            Header添加內容

            創建一個SOAPHeaderElement對象,從而可以添加內容到header中。以下代碼演示了如何使用SOAPEnvelope對象創建一個SOAPHeaderElement。

            SOAPHeader hdr = envelope.getHeader();

            Name headerName = envelope.createName("Purchase Order","PO", "http://www.sonata.com/order");

            SOAPHeaderElement headerElement = hdr.addHeaderElement(headerName);

            HeaderElement通過Name對象headerName進行標識。AddHeaderElement方法是用來添加或者創建header元素的。

            為了添加內容到headerElement,請象以下代碼示例那樣使用addTextNode方法。

            headerElement.addTextNode("order");

            SOAPHeader對象包含一個內容為"order"的SOAPHeaderElement對象。

            向消息添加內容

            你可以向SOAPPart對象,或者一或多個AttachmentPart對象添加內容,或者可以向消息的這兩個部分都添加內容。

            為了向消息體添加內容,請創建一個SOAPBodyElement對象并添加一個使用SOAPElement.addTextNode方法建立的XML元素。下面的代碼演示了如何添加內容到消息:

            SOAPEnvelope envelope = sp.getSOAPEnvelope();

            SOAPBody bdy = envelope.getSOAPBody();

            SOAPBodyElement gltp = bdy.addBodyElement(envelope.createName("GetLastTradePrice", "ztrade", "http://wombat.ztrade.com"));

            gltp.addChildElement(envelope.createName("symbol","ztrade", "http://wombat.ztrade.com")).addTextNode("SUNW");;

            代碼的前三行訪問了SOAPBody對象body,目的是創建一個新 SOAPBodyElement對象并把它添加到body上。CreateName方法需要Name對象作為參數,用來指定被添加的 SOAPBodyElement。最后一行添加傳遞給addTextNode方法的XML字符串。

            向消息添加一個附件

            向消息添加附件的過程對于使用或不使用消息提供者的客戶端來說都是一樣的。使用AttachmentPart對象向消息中添加附件部分。

            使用SOAPMessage對象創建AttachmentPart對象。SOAPMessage 類含有三個創建附件的方法。第一個方法允許你創建一個沒有內容的AttachmentPart。就是說,以后再使用AttachmentPart的方法 setContent來添加內容到附件。

            URL url = new URL(data);

            AttachmentPart ap = msg.createAttachmentPart(new DataHandler(url));

            SetContent有兩個參數,對應內容的Java對象以及標識內容類型的String對象。 內容是消息的SOAPBody部分,消息有一個值為"text/xml"的內容-類型(Content-Type)header,這是因為內容只能是 XML格式。在AttachmentPart中,內容的類型只能被指定為該對象能夠容納的任意類型。

            每個AttachmentPart都有一個或多個與之相關的header。setContent 方法中用到的類型就是Content-Type這個header類型。這是唯一必須具備的header。你還可以設置其他可選的header,例如 Content-Id和Content-Location。為了方便,JAXM和SAAJ API為Content-type、 Content-Id、和Content-Location這幾個header提供了get和set方法。這些header在消息擁有多個附件的時候,可 以幫助對附件的訪問。

            以下代碼演示了如何使用setContent方法:

            String stringContent = "Update address for Sunny Skies " + "Inc., to 10 Upbeat Street, Pleasant Grove, CA 95439";

            ap.setContent(stringContent, "text/html");
            ap.setContentId("update_address");
            msg.addAttachmentPart(ap);

            如果你還想附加一個jpeg圖像,setContent方法的第二個參數必須被設為"image/jpeg"。下面的代碼演示了如何使用setContent方法附加圖片:

            AttachmentPart ap2 = msg.createAttachmentPart();

            byte[] jpegData = . . .;

            ByteArrayInputStream stream = new ByteArrayInputStream(jpegData);

            ap2.setContent(stream, "image/jpeg");

            msg.addAttachmentPart(ap2);

            AttachmentPart的另外兩個方法允許你創建帶內容的AttachmentPart對 象。其中一個與AttachmentPart.setContent方法很象。它需要一個包含內容的Java對象和一個指定內容類型的String作為參 數。對象可以是String、stream、 javax.xml.transform.Source對象、或  javax.activation.DataHandler對象。

            另一個創建帶內容的AttachmentPart對象的方法需要一個DataHandler對象作為輸入參數,它是JavaBeans激活框架(JAF)的一部分

            以下代碼演示了如何在內容中使用DataHandler。首先為想要作為內容添加的文件創建一個java.net.URL對象。創建DataHandler對象,即javax.activation.DataHandler 對象dh,使用URL對象對其進行初始化,然后把dh傳遞給createAttachmentPart方法。

            URL url = new URL("http://greatproducts.com/gizmos/img.jpg");
            DataHandler dh = new DataHandler(url);
            AttachmentPart ap = msg.createAttachmentPart(dh);
            ap.setContentId("gyro_image")
            msg.addAttachmentPart(ap);

            發送消息

            單獨客戶端

            為了發送消息,單獨客戶端使用SOAPConnection的call方法。該方法需要兩個輸入參數,要發送的消息和消息的目的地,目的地是一個包含接收者URL的Endpoint對象。

            利用SoapConnection的情況下,使用javax.xml.soap.SOAPConnection.call()發送消息。

            例如:

            URL urlEndpoint = new URL(to);

            SOAPMessage reply = con.call(msg, urlEndpoint);

            從響應消息中檢索內容

            客戶端使用onMessage方法檢索消息內容??蛻舳送ㄟ^消息得到envelope,再通過 envelope得到body,從而訪問SOAPBody對象。訪問SOAPBody對象是因為內容存放在該元素中。為了檢索由 Node.addTextNode方法添加的內容,請調用Node.getValue方法。GetValue返回調用元素的直接子元素的值。為了訪問 bodyElement,需要在body上調用getChildElement方法。以下代碼演示了如何從響應消息中檢索內容。

            public SOAPMessage onMessage(SOAPMessage message)

            {

            SOAPEnvelop env = msg.getSOAPPart().getEnvelope();

            env getBody()
               .addChildElement(env.createName("Response"))
               .addTextNode("This is a Response");

            return msg;

            }

            想要從含有附件的消息中檢索內容,你需要訪問附件。沒有參數的情況 下,SOAPMessage.getAttachments方法返回指向所有AttachmentPart對象的java.util.Iterator對 象。以下代碼打印出了SOAPMessage對象消息中每一個AttachmentPart對象的內容。

            java.util.Iterator it = message.getAttachments();

            while (it.hasNext()) {

            AttachmentPart attachment = (AttachmentPart)it.next();
            Object content = attachment.getContent();
            String id = attachment.getContentId();
            System.out.print("Attachment " + id + " contains: " + content);
            System.out.println("");

            }

            訪問消息的附件部分

            當收到帶有附件的消息或是希望改變消息附件的時候,都需要訪問消息的附件。沒有附加信息的 SOAPMesssage.getAttachments方法返回指向消息中所有AttachmentPart對象的 java.util.Iterator對象。以下代碼演示了如何訪問附件從而獲得SOAPMessage對象消息中每個AttachmentPart對象 的內容。

            java.util.Iterator it = msg.getAttachments();

            while (it.hasNext()) {

            AttachmentPart ap = it.next();
            Object content = ap.getContent();
            String id = ap.getContentId();
            System.out.print("Attachment " + id + " contains: " + content);
            System.out.println("");

            }

            組裝并部署SOAP客戶端

            利用JAXM API和SAAJ API創建的應用程序被組裝為web應用(WAR)或者基于J2EE平臺的應用(EAR)。關于組裝和部署web應用,請參見Sun ONE Application Server開發人員web應用指南。

            SOAP 服務


            本節講述如何編寫SOAP服務以及如何在SOAP消息中處理異常和錯誤。本節講述以下主題:

            創建SOAP服務

            SOAP服務是SOAP消息的最終接收者,并且被實現為servlet。要么創建你自己的servlet,要么擴展javax.xml.messaging包中的JAXMServlet類。本節講述了基于JAXMServlet類創建SOAP服務的過程。

            為了創建SOAP服務,你的servlet必須實現ReqRespListener或者OneWayListener接口。ReqRespListener需要返回一個回應。

            public class MyServlet extends JAXMServlet implements ReqRespListener{

            ...

            ...

            }

            public SOAPMessage onMessage(SOAP Message msg)

            使用任意借口,實現一個叫做onMessage(SOAPMsg)的方法。

            以下代碼是使用JAXMServlet 的SOAP消費者的完整清單:

            public class MyServlet extends JAXMServlet implements ReqRespListener {

               public SOAPMessage onMessage(SOAP Message msg) {

               //Process message here

               }
            }

            JAXMServlet在使用HTTP POST方法接受消息之后會調用onMessage。你就省去了實現自己的doPost()方法把收到的消息轉換成為SOAP消息的麻煩。

            OnMessage方法需要分解由servlet傳入的SOAP消息并處理它的內容。處理消息包括訪問SOAP消息的組成部分。如果在處理消息過程中出現故障,服務需要創建SOAP fault對象并把它發回到客戶端。關于處理錯誤的更多信息,請參見。

            以下代碼演示了SOAP消息的處理:

            {http://xml.coverpages.org/dom.html

            SOAPEnvelope env = reply.getSOAPPart().getEnvelope();

            SOAPBody sb = env.getBody();

            // create Name object for XElement that we are searching for Name ElName = env.createName("XElement");

            //Get child elements with the name XElement
            Iterator it = sb.getChildElements( ElName );

            //Get the first matched child element.
            //We know there is only one.
            SOAPBodyElement sbe = (SOAPBodyElement) it.next();

            //Get the value for XElement
            MyValue = sbe.getValue(); }

            異常和錯誤處理

            On the client's side, JAXM and SAAJ uses a SOAP exception to handle errors that occur during the generation of the SOAP request or unmarshalling of the response. This section describes the following topics:

            在客戶端,JAXM和SAAJ使用SOAP異常來處理SOAP 請求生成過程中,或者響應反編組過程中發生的錯誤。本節講述以下主題:

            錯誤處理

            服務器端代碼必須使用SOAPFault對象處理在反編組請求、處理消息、或是編組響應過程中發生的錯誤。SOAPFault接口擴展了SOAPBodyElement接口。

            在服務器端,SOAP消息擁有用來形成錯誤報告的特定元素和格式:SOAP消息的body可以包 含一個SOAPFault元素來報告發生在請求處理過程中的錯誤。在服務器端創建并且從服務器發回到客戶端的SOAP消息包含了SOAPFault對象, 它報告了消息生成者沒有預期到的任何行為。

            SOAPFault元素定義了以下四個子元素

            faultcode

            標識錯誤的代碼。軟件使用該代碼為鑒別錯誤提供一個算法機制。此元素是必需的。

            faultstring

            一個描述錯誤代碼所標識的錯誤的字符串。該元素提供了為人們無法理解的錯誤提供了一個解釋。此元素是必需的。

            faultactor

            指定錯誤來源的URI:誰引起了錯誤。如果消息沒有通過任何中間站直接發送給它的最終目的地,該元素不是必需的。如果在中間站發生了錯誤,這個錯誤必須包含一個faultactor元素。

            detail

            該元素持有與body元素相關的特定信息。如果body元素的內容不能夠被成功處理,它就必須被給出。因此,如果這個元素丟失了,客戶端應該推斷出body元素已經被處理了。除了畸形負載,這個元素對任何錯誤都不是必須的,你可以在其他情況下用它來為客戶端提供附加信息。

            預定義的錯誤代碼

            SOAP規范列出了以下四個預定義的faultcode值:

            VersionMismatch

            處理方發現SOAP envelope元素有一個不合法的命名空間;也就是說,SOAPEnvelope元素的命名空間不是http://schemas.xmlsoap.org/soap/envelope/.

            MustUnderstand

            SOAPHeader元素的一個直接子元素要么無法理解,要么接收者不能正確處理。這個元素的MustUnderstand屬性設被為1(true)。

            Client

            消息格式不正確或者沒包含合適的信息。例如,消息沒有包含正確的認證或付款信息??蛻舳藨摲g這個代碼從而指定這個消息在重新發送之間必須被修改。如果這是一個返回代碼,SOAPFault對象應該包括一個detailEntry對象,它為格式錯誤的消息提供附加信息。

            Server

            該消息由于一些與它的內容沒有聯系的原因而不能被處理。例如,消息的一個處理者無法與另一個上游的、沒有相應的消息處理者進行通信?;蛘?,服務器需要訪問的數據庫崩潰了??蛻舳藨摻忉屵@個錯誤,以指出事務可以在以后的某個及時時間點成功。

            定義SOAP錯誤

            可以使用SOAPFault對象的方法為faultcode、 faultstring、和faultctor指定值。以下代碼演示了SOAPFault對象的創建和faultcode、 faultstring、faultctor屬性的設定。

            SOAPFault fault;

            reply = factory.createMessage();

            envp = reply.getSOAPPart().getEnvelope(true);

            someBody = envp.getBody();

            fault = someBody.addFault():

            fault.setFaultCode("Server");

            fault.setFaultString("Some Server Error");

            fault.setFaultActor("http://xxx.me.com/list/endpoint.esp/");

            reply.saveChanges();

            一旦發生服務器錯誤,服務器能夠在對收到的SOAP消息做出的回應中,返回這個對象。

            以下代碼演示了如何定義一個detail和detail entry對象。注意,必須為detail entry對象創建一個名稱。

            SOAPFault fault = someBody.addFault();

            fault.setFaultCode("Server");

            fault.setFaultActor("http://foo.com/uri");

            fault.setFaultString ("Unkown error");

            DetailEntry entry = detail.addEntry(envelope.createName("125detail", "m", "Someuri");

            entry.addTextNode("the message cannot contain the string //");

            reply.saveChanges();

            組裝并部署SOAP服務

            使用JAXM API和SAAJ API創建的應用被組裝為web應用(WAR)或者基于J2EE平臺的應用(EAR)。關于組裝和部署web應用,請參見Sun ONE Application Server開發人員web應用指南。

            客戶端和服務示例

            客戶端和服務應用程序示例被捆綁在Sun ONE Application Server中。這些例子示范如何創建發送和接收XML消息的服務和客戶端。你可以在下面的位置找到這些例子:

            install_dir/samples/webservices/jaxm

            install_dir/imq/demo/jaxm

            使用SAAJ 和JAXM的 SOAP客戶端及服務

            816-7869-10

            posted on 2012-06-22 16:10 大龍 閱讀(1199) 評論(0)  編輯 收藏 引用

            99久久精品九九亚洲精品| 蜜臀久久99精品久久久久久小说| 狠狠久久亚洲欧美专区| 狠狠狠色丁香婷婷综合久久俺| 国产精品九九久久免费视频| 欧美国产精品久久高清| 色综合合久久天天给综看| 伊人久久大香线蕉av不变影院 | 亚洲人成电影网站久久| 久久精品?ⅴ无码中文字幕| 久久免费观看视频| 久久人妻AV中文字幕| 97久久国产综合精品女不卡 | 午夜久久久久久禁播电影| 久久综合给合久久狠狠狠97色| 99久久99这里只有免费费精品| 99久久精品国产一区二区三区| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 精品欧美一区二区三区久久久| 无码AV波多野结衣久久| 国产真实乱对白精彩久久| 国产精品亚洲综合久久| 亚洲一区中文字幕久久 | 伊人久久精品线影院| 亚洲国产日韩欧美久久| 久久久国产精品福利免费| 久久久久久久久久久精品尤物| 国产精品美女久久久久av爽| 久久国产亚洲高清观看| 狠狠色噜噜色狠狠狠综合久久| 久久无码一区二区三区少妇| 久久国产精品一区| 国产一区二区精品久久岳| 久久婷婷综合中文字幕| 久久国产精品99精品国产| 久久久SS麻豆欧美国产日韩| 久久久久国产亚洲AV麻豆| 国产精品热久久无码av| 久久久久婷婷| 亚洲国产精品无码久久九九| 久久人人添人人爽添人人片牛牛 |