中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > Java与XML
利用兼容JAX-RPC的Web服务处理异常
作者:未知 时间:2005-08-10 16:50 出处:BEA dev2dev 责编:chinaitpower
              摘要:利用兼容JAX-RPC的Web服务处理异常
  介绍
在Web服务领域,Web服务端点抛出的异常作为SOAP错误传递给客户端。根据JAX-RPC(Java API for XML-based RPC)规范,SOAP错误要么映射为java.xml.rpc.soap.SOAPFaultException,这是一个特定于服务的异常类,要么映射为RemoteException。




  异常处理
  在WSDL(Web Services Description Language,Web 服务描述语言)中,wsdl:fault 元素是wsdl:operation中的可选元素,它规定了任何错误消息的抽象消息格式,而这些错误信息可能作为远程操作的结果来输出。

  根据 WSDL 规范,错误信息必须有单独部分。wsdl:fault 要么映射为 java.rmi.RemoteException类(或它的子类),这是一个特定于服务的 Java 异常,要么映射为 java.xml.rpc.soap.SOAPFaultException类。

  清单1 包含了一个WSDL的片段,它定义了一个wsdl:fault。根据以下部分,(注意这个WSDL中缺省名称空间是 xmlns=<"http://schemas.xmlsoap.org/wsdl/">,因此,“fault”实际上就是wsdl:fault),wsdl:fault 消息“MyException”定义在wsdl:operation “sendSOAPFault”中。同时wsdl:fault 消息“MyException”通过单独部分来定义,它被映射到一个java:examples.webservices.basic.javaclassle:MyException 类型。

<message name="MyException">

          <part xmlns:partns="java:examples.webservices.basic.javaclass" type="partns:MyException"

name="MyException">

  </part>

</message>

.....

 

          <operation name="sendSOAPFault">

                    <input message="tns:sendSOAPFault">

</input>

                    <output message="tns:sendSOAPFaultResponse">

</output>

                               <fault name="MyException" message="tns:MyException">

</fault>

          </operation>

  清单1:带有wsdl:fault的WSDL

<types xmlns:tns="http://www.bea.com/servers/WebLogic Server70/samples/examples/webservices/basic

/javaclass"

 

xmlns:wsr="http://www.openuri.org/2002/10/soap/reliability/"

xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"

 

xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"

xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"

 

xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"

xmlns:soap12enc="http://www.w3.org/2003/05/soap-encoding"

 

xmlns:conv="http://www.openuri.org/2002/04/wsdl/conversation/"

xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"

 

xmlns:s="http://www.w3.org/2001/XMLSchema"

xmlns="http://schemas.xmlsoap.org/wsdl/">

.....

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"

 

xmlns:stns="java:examples.webservices.basic.javaclass"

elementFormDefault="qualified" attributeFormDefault="qualified"

 

targetNamespace="java:examples.webservices.basic.javaclass">

                    <xsd:element type="stns:MyException" name="MyException">

   </xsd:element>

                    <xsd:complexType name="MyException">

                      <xsd:sequence>

                        <xsd:element type="xsd:int" name="errorId" minOccurs="1" maxOccurs="1">

     </xsd:element>

                        <xsd:element type="xsd:string" name="errorMessage" minOccurs="1" nillable="true"

 

maxOccurs="1">

     </xsd:element>

                               </xsd:sequence>

                    </xsd:complexType>

                    </xsd:schema>

.....

<message name="MyException">

          <part xmlns:partns="java:examples.webservices.basic.javaclass" type="partns:MyException"

name="MyException">

  </part>

</message>

.....

          <portType name="HelloWorldPort">

                    <operation name="sendSOAPFault">

                               <input message="tns:sendSOAPFault">

   </input>

                               <output message="tns:sendSOAPFaultResponse">

   </output>

                               <fault name="MyException" message="tns:MyException">

   </fault>

                    </operation>

          </portType>

  一个特定于服务的Java 异常(从wsdl:fault和相应的wsdl:message映射)直接或间接扩展了java.lang.Exception 类。在wsdl:message中的单个信息部分(从wsdl:fault元素中引用)可能是xsd:complexType 或一个简单的XML类型。

  下面部分讨论如何处理SOAPFaultException 和 特定于服务的异常。
  SOAPFaultException 异常的处理

  SOAPFaultException异常代表一个SOAP 错误。这个异常由从wsdl:operation映射的Java 方法抛出。

  SOAP fault中的消息部分映射到具体元素的内容,这些内容可以在SOAPFaultException中通过getDetail 方法访问。javax.xml.soap.SOAPFactory 类中的方法createDetail 创建javax.xml.soap.Detail的一个实例。

  Faultstring(错误字符串)可提高SOAP错误描述的易读性。faultcode(错误代码)元素则提供了SOAP错误的算法映射。

  下面是SOAPFaultException 类的结构。

         package javax.xml.rpc.soap;

          public class SOAPFaultException extends java.lang.RuntimeException {

          public SOAPFaultException(QName faultcode,

                    String faultstring,

                    String faultactor,

                    javax.xml.soap.Detail detail) { ... }

          public QName getFaultCode() { ... }

          public String getFaultString() { ... }

          public String getFaultActor() { ... }

          public javax.xml.soap.Detail getDetail() { ... }

          }

  下面这个例子阐明了SOAPFaultException的处理

  例如:
  服务实现
  清单2 包含了Web 服务在服务器端的实现。在这个Web 服务中,sendSOAPFault()方法正抛出一个SOAPFaultException

  清单 2:Web 服务抛出 SOAPFaultException

         import javax.xml.soap.SOAPFactory;

          import javax.xml.soap.Detail;

          import javax.xml.soap.SOAPException;

 

          import javax.xml.namespace.QName;

          import javax.xml.rpc.soap.SOAPFaultException;

 

          public final class HelloWorld {

 

          public void sendSOAPFault(){

              Detail detail = null;

              try{

                detail = SOAPFactory.newInstance().createDetail();

                detail.addChildElement( "MyDetails" ).addTextNode( "failed" );

              }catch( SOAPException e ){

                e.printStackTrace();

              }

              throw new SOAPFaultException(

                  new QName( "http://www.bea.com/samples/ws/fault", "ServerFailed" ),      

                  "sendSOAPFault method failed",

                  "http://foo/bar/baz/",

                  detail );

            }

          }

  客户端实现:
  清单3 是Web 服务的客户端实现,它调用了sendSOAPFault() 操作。这是一个基于存根的客户端,它捕获由sendSOAPFault操作抛出的SOAPFaultException。

  清单3:基于存根的客户端处理 SOAPFaultException

  import javax.xml.rpc.soap.SOAPFaultException;

  import java.rmi.RemoteException;

 

  public final class Client {

 

    public Client() {}

 

    public static void main(String[] argv)

      throws Exception

    {

      // Setup the global JAXM message factory

      System.setProperty("javax.xml.soap.MessageFactory",

        "weblogic.webservice.core.soap.MessageFactoryImpl");

      // Setup the global JAX-RPC service factory

      System.setProperty( "javax.xml.rpc.ServiceFactory",

        "weblogic.webservice.core.rpc.ServiceFactoryImpl");

 

      HelloWorld_Impl ws = new HelloWorld_Impl(argv[0]);

      HelloWorldPort port  = ws.getHelloWorldPort();

         

      try {

      port.sendSOAPFault();

      } // try

      catch(SOAPFaultException ex) {

          System.out.println(ex.toString());

          ex.printStackTrace();

      }

      catch(RemoteException ex) {

          if (ex.getCause() instanceof SOAPFaultException) {

                    SOAPFaultException fault = (SOAPFaultException)ex.getCause();

                    System.out.println("[Client] Fault Detail : " + fault.getDetail().toString());

                    System.out.println("[Client] Fault Actor : " + fault.getFaultActor());

                    System.out.println("[Client] Fault String : " + fault.getFaultString());

          }

          System.out.println("[Client] Exception stack trace :");

          ex.printStackTrace();

      }

   }

  }

  注意:
  因为在BEA Weblogic Server Web 服务的客户端存根中,错误(由服务器抛出SOAPFaultException引起)被映射到java.rmi.RemoteException,Client.java(一个 基于存根的客户端)将需要捕获java.rmi.RemoteException。但是当使用动态调用接口(Dynamic Invocation Interface,DII)客户端时,它使用了java.xml.rpc.Call 接口,将需要捕获SOAPFaultException。
调用sendSOAPFault()的SOAP请求/响应信息:
  清单4包含了调用sendSOAPFault()时的SOAP跟踪。

  清单 4: 调用sendSOAPFault() 的SOAP 请求/响应信息

    [java] <!-------------------- REQUEST ---------------->

     [java] URL        :  http://localhost:7001/basic_javaclass/HelloWorld

     [java] Headers    :

     [java]   SOAPAction: [""]

     [java]   Content-Type: [text/xml]

 

     [java] <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://sche

mas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><en

v:Header/><env:Body env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/

"><m:sendSOAPFault xmlns:m="http://www.bea.com/servers/WebLogic Server70/samples/examples/we

bservices/basic/javaclass"/></env:Body></env:Envelope>

     [java] <!-------------------- END REQUEST ------------>

     [java] <!-------------------- RESPONSE --------------->

     [java] URL           : http://localhost:7001/basic_javaclass/HelloWorld

     [java] Response Code :500

     [java] Headers       :

     [java]   Date=Fri, 18 Jun 2004 17:20:15 GMT

     [java]   Server=WebLogic Server 8.1 SP2 Fri Dec 5 15:01:51 PST 2003 316284 with CR182483

     [java]   Content-Length=587

     [java]   Content-Type=text/xml; charset=utf-8

     [java] Envelope   :

     [java] <?xml version="1.0" encoding="utf-8" standalone="yes"?><env:Envelope

 xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.

org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/enco

ding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><env:Header/><env:Body><env:

Fault xmlns:fault="http://www.bea.com/samples/ws/fault"><faultcode>fault:ServerF

ailed</faultcode><faultstring>sendSOAPFault method failed</faultstring><faultact

or>http://foo/bar/baz/</faultactor><detail><MyDetails>failed</MyDetails></detail

></env:Fault></env:Body></env:Envelope>

     [java] <!-------------------- END RESPONSE ----------->

     [java] [Client] Fault Detail : <detail>

     [java]  <MyDetails>failed</MyDetails>

     [java] java.rmi.RemoteException: SOAP Fault:javax.xml.rpc.soap.SOAPFaultException:

sendSOAPFault method failed

     [java] Detail:

     [java] <detail>

     [java] </detail>

     [java] [Client] Fault Actor : http://foo/bar/baz/

     [java] [Client] Fault String : sendSOAPFault method failed

     [java]  <MyDetails>failed</MyDetails>

     [java] </detail>; nested exception is:

     [java]     javax.xml.rpc.soap.SOAPFaultException: sendSOAPFault method failed

     [java] [Client] Exception stack trace :

     [java]     at examples.webservices.basic.javaclass.HelloWorldPort_Stub.sendSOAPFault

(HelloWorldPort_Stub.java:29)

     [java]     at examples.webservices.basic.javaclass.Client.main(Client.java:37)

     [java] Caused by: javax.xml.rpc.soap.SOAPFaultException: sendSOAPFault method failed

     [java]     at weblogic.webservice.core.ClientDispatcher.receive(ClientDispatcher.java:313)

     [java]     at weblogic.webservice.core.ClientDispatcher.dispatch(ClientDispatcher.java:144)

     [java]     at weblogic.webservice.core.DefaultOperation.invoke(DefaultOperation.java:457)

     [java]     at weblogic.webservice.core.DefaultOperation.invoke(DefaultOperation.java:443)

     [java]     at weblogic.webservice.core.rpc.StubImpl._invoke(StubImpl.java:290)

     [java]     at examples.webservices.basic.javaclass.HelloWorldPort_Stub.sendSOAPFault

(HelloWorldPort_Stub.java:25)

     [java]     ... 1 more

  特定服务的异常处理
  一个特定服务的Java 异常(从wsdl:fault 和相应的wsdl:message映射)直接或间接扩展了java.lang.Exception 类。wsdl:message中的单独消息部分(从wsdl:fault 元素引用) 可能是xsd:complexType 或者是一个简单XML类型。

  清单5 显示了从wsdl:fault 到特定服务的Java 异常的映射。Wsdl:message 在MyException类型中有一个单独部分,MyException 是一种 complexType。

  清单5 : 包含wsdl:fault 的具有complexType 的WSDL

.....

                    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"

 

xmlns:stns="java:examples.webservices.basic.javaclass"

elementFormDefault="qualified" attributeFormDefault="qualified"

 

targetNamespace="java:examples.webservices.basic.javaclass">

                               <xsd:element type="stns:MyException" name="MyException">

   </xsd:element>

                    <xsd:complexType name="MyException">

                      <xsd:sequence>

                        <xsd:element type="xsd:int" name="errorId" minOccurs="1" maxOccurs="1">

     </xsd:element>

                        <xsd:element type="xsd:string" name="errorMessage" minOccurs="1" nillable="true"

 

maxOccurs="1">

     </xsd:element>

                      </xsd:sequence>

                    </xsd:complexType>

          </xsd:schema>

.....

          <message name="MyException">

            <part xmlns:partns="java:examples.webservices.basic.javaclass"type="partns:MyException"

name="MyException">

  </part>

          </message>

.....

          <portType name="HelloWorldPort">

                    <operation name="sendSOAPFault">

                               <input message="tns:sendSOAPFault">

   </input>

                               <output message="tns:sendSOAPFaultResponse">

   </output>

                               <fault name="MyException" message="tns:MyException">

   </fault>

                    </operation>

          </portType>

  注意:
  在WebLogic Server 7.0 和WebLogic Server 8.1中,并不支持特定服务的异常处理。
因此,在WebLogic Server 7.0 和 WebLogic Server 8.1 中,可以从WSDL 生成Web 服务,该WSDL定义了complexType的wsdl:fault。这将会导致以下结果:

  a)生成的服务中的方法不抛出相关的异常。
  b)一旦从服务器端抛出以上异常,线上的SOAP信息将会显示这个异常具有一个基本类型,而不是MyException类型
  c) 通过clientgen生成的客户端存根/代理无法生成异常的正确实现。

  相反地,当从Java程序生成Web服务时,如果这个Java程序抛出用户定义的异常或特定服务的异常,也会遇到类似问题。

  在WebLogic Server 8.1 SP1及以上版本中,通过实现JAX-RPC规范的5.5.5节和4.3.6节,已经增加了这一支持。

  在WebLogic Server 7.0 和WebLogic Server 8.1中,需要在服务器端作为一个工作区抛出SOAPFaultException 而不是特定服务的异常。

  下面的例子说明了特定服务的异常处理。
  例子:
  服务实现
  清单 6显示了一个在服务器端实现的Web服务,这里用sendSOAPFault()方法抛出MyException,它是一个特定服务的异常:

  清单 6: Web 服务抛出MyException,这是一个特定服务的异常。

a) MyException implementation

 

 public class MyException extends Exception {

          private String errorMessage;

          private int errorId;

 

          //public MyException();

          public MyException(String errorMessage, int errorId) {

                    this.errorMessage = errorMessage;

                    this.errorId = errorId;

          }

          public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; }         

          public String getErrorMessage() { return errorMessage; }

 

          public void setErrorId(int errorId) { this.errorId = errorId; }

          public int getErrorId() { return errorId; }

 }

 

 b) Web Service backend component

 

 import javax.xml.soap.SOAPFactory;

 import javax.xml.soap.Detail;

 import javax.xml.soap.SOAPException;

 import javax.xml.namespace.QName;

 import javax.xml.rpc.soap.SOAPFaultException;

 

 public final class HelloWorld {

 public void sendSOAPFault()throws MyException {

          throw new MyException("sendSOAPFault() call fails !", 10);

 }

 }

  客户端实现
  清单 7a-b 包含了一个从Web服务客户端调用sendSOAPFault()操作的实现。
  清单 7a-b提供了实现方式:

  (a) 基于存根 和
  (b) 动态调用接口(DII)或动态Web服务客户端,它捕获从sendSOAPFault() 操作中抛出的SOAPFaultException。

  清单7a: 基于存根的客户处理 MyException,这是一个特定服务的异常

         import javax.xml.rpc.soap.SOAPFaultException;

          import java.rmi.RemoteException;

 

          public final class Client {

 

            public Client() {}

 

            public static void main(String[] argv)

              throws Exception

            {

              // Setup the global JAXM message factory

              System.setProperty("javax.xml.soap.MessageFactory",

                "weblogic.webservice.core.soap.MessageFactoryImpl");

              // Setup the global JAX-RPC service factory

              System.setProperty( "javax.xml.rpc.ServiceFactory",

                "weblogic.webservice.core.rpc.ServiceFactoryImpl");

 

              HelloWorld_Impl ws = new HelloWorld_Impl(argv[0]);

              HelloWorldPort port  = ws.getHelloWorldPort();

         

              try {

              port.sendSOAPFault();

              } // try

 

              catch(MyException ex) {

                    System.out.println("[Client] Exception caught is : " + ex.toString());

                    System.out.println("[Client] errorMessage : " + ex.getErrorMessage());

                    System.out.println("[Client] errorId : " + ex.getErrorId());

 

                    System.out.println("[Client] Exception stack trace :");

                    ex.printStackTrace();

              }

            }

          }

  清单 7b:DII 或动态客户端处理MyException,这是一个特定服务的异常

import javax.xml.rpc.ServiceFactory;

 import javax.xml.rpc.Service;

 import javax.xml.rpc.Call;

 import javax.xml.rpc.ParameterMode;

 import javax.xml.namespace.QName;

 

 import javax.xml.rpc.soap.SOAPFaultException;

 import java.rmi.RemoteException;

 

 public class DynamicClient {

   public static void main(String[] args) throws Exception {

     //set weblogic ServiceFactory

     System.setProperty( "javax.xml.rpc.ServiceFactory",

         "weblogic.webservice.core.rpc.ServiceFactoryImpl" );

 

     //create service factory

     ServiceFactory factory = ServiceFactory.newInstance();

     String targetNamespace = "http://www.bea.com/servers/WebLogicServer70/samples/examples

/webservices/basic/javaclass";

 

     QName serviceName = new QName( targetNamespace, 

         "HelloWorld" );

 

     QName portName = new QName( targetNamespace,

         "HelloWorldPort" );

 

     QName operationName = new QName( targetNamespace,

         "sendSOAPFault" );

 

     Service service = factory.createService( serviceName );

     Call call = service.createCall();

     call.setPortTypeName( portName );

     call.setOperationName( operationName );

     call.setTargetEndpointAddress("http://localhost:7001/basic_javaclass/HelloWorld?WSDL");

 

     try {

     call.invoke(new Object[]{});

     } // try

 

     catch(SOAPFaultException ex) {

                    System.out.println("[Client] Fault Detail : " + ex.getDetail().toString());

                    System.out.println("[Client] Fault Actor : " + ex.getFaultActor());

                    System.out.println("[Client] Fault String : " + ex.getFaultString());

                    ex.printStackTrace();

     }

 

     catch(RemoteException ex) {

          if (ex.getCause() instanceof SOAPFaultException) {

                    SOAPFaultException fault = (SOAPFaultException)ex.getCause();

                    System.out.println("[Client] Fault Detail : " + fault.getDetail().toString());

                    System.out.println("[Client] Fault Actor : " + fault.getFaultActor());

                    System.out.println("[Client] Fault String : " + fault.getFaultString());

          }

          System.out.println("[Client] Exception stack trace :");

          ex.printStackTrace();

     }

 

   }

 }

  注意:
  在BEA WebLogic Server Web 服务客户端存根中,由于错误(由抛出特定服务异常的服务器引起)被映射成特定服务的异常,所以Client.java(基于存根的客户端)将需要捕获这个特定服务的异常。

  但是,当使用动态调用接口(DII)客户端时,客户端使用了javax.xml.rpc.Call 接口,它将需要捕获RemoteException 或 SOAPFaultException。这个特定服务的异常将被包装在SOAPFaultException中。

  调用sendSOAPFault()的SOAP请求/响应消息
  清单 8a-b 包含了调用sendSOAPFault()时的SOAP 跟踪。

  清单 8a : 从基于存根的客户端调用sendSOAPFault()时的SOAP跟踪

    [java] <!-------------------- REQUEST ---------------->

     [java] URL        :  http://localhost:7001/basic_javaclass/HelloWorld

     [java] Headers    :

     [java]   SOAPAction: [""]

     [java]   Content-Type: [text/xml]

 

     [java] <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://sche

mas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><en

v:Header/><env:Body env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/

"><m:sendSOAPFault xmlns:m="http://www.bea.com/servers/WebLogic Server70/samples/examples/we

bservices/basic/javaclass"/></env:Body></env:Envelope>

     [java] <!-------------------- END REQUEST ------------>

     [java] <!-------------------- RESPONSE --------------->

     [java] URL           : http://localhost:7001/basic_javaclass/HelloWorld

     [java] Response Code :500

     [java] Headers       :

     [java]   Date=Wed, 23 Jun 2004 21:39:06 GMT

     [java]   Server=WebLogic Server 8.1 SP2 Fri Dec 5 15:01:51 PST 2003 316284 with CR182483

     [java]   Content-Length=730

     [java]   Content-Type=text/xml; charset=utf-8

     [java] Envelope   :

     [java] <?xml version="1.0" encoding="utf-8" standalone="yes"?><env:Envelope

 xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.

org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/enco

ding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><env:Header/><env:Body><env:

Fault><faultcode>env:Server</faultcode><faultstring>Service specific exception:

examples.webservices.basic.javaclass.MyException</faultstring><detail><MyExcepti

on xmlns:n1="java:examples.webservices.basic.javaclass" xsi:type="n1:MyException

"><errorId xsi:type="xsd:int">10</errorId><errorMessage xsi:type="xsd:string">se

ndSOAPFault() call fails !</errorMessage></MyException></detail></env:Fault></en

v:Body></env:Envelope>

     [java] <!-------------------- END RESPONSE ----------->

     [java] [Client] Exception caught is : MyException{ errorId=<10> errorMessage=<sendSOAPFault()

call fails !> }

     [java] [Client] errorMessage : sendSOAPFault() call fails !

     [java] [Client] errorId : 10

     [java] [Client] Exception stack trace :

     [java] MyException{ errorId=<10> errorMessage=<sendSOAPFault() call fails !> }

     [java]     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

     [java]     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.

java:39)

     [java]     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.

java:27)

     [java]     at java.lang.reflect.Constructor.newInstance(Constructor.java:274)

     [java]     at weblogic.xml.schema.binding.BeanExceptionCodecBase.invokeConstructor(BeanExceptionCodecBase.

java:134)

     [java]     at weblogic.xml.schema.binding.BeanExceptionCodecBase.deserialize(BeanExceptionCodecBase.

java:72)

     [java]     at weblogic.xml.schema.binding.RuntimeUtils.invoke_deserializer(RuntimeUtils.java:428)

     [java]     at weblogic.xml.schema.binding.RuntimeUtils.invoke_deserializer(RuntimeUtils.java:328)

     [java]     at weblogic.webservice.core.DefaultPart.toJava(DefaultPart.java:384)

     [java]     at weblogic.webservice.core.FaultMessage.toJava(FaultMessage.java:227)

     [java]     at weblogic.webservice.core.ClientDispatcher.deserializeFault(ClientDispatcher.java:391)

     [java]     at weblogic.webservice.core.ClientDispatcher.receive(ClientDispatcher.java:317)

     [java]     at weblogic.webservice.core.ClientDispatcher.dispatch(ClientDispatcher.java:144)

     [java]     at weblogic.webservice.core.DefaultOperation.invoke(DefaultOperation.java:457)

     [java]     at weblogic.webservice.core.DefaultOperation.invoke(DefaultOperation.java:443)

     [java]     at weblogic.webservice.core.rpc.StubImpl._invoke(StubImpl.java:290)

     [java]     at examples.webservices.basic.javaclass.HelloWorldPort_Stub.sendSOAPFault(HelloWorldPort_Stub.

java:25)

     [java]     at examples.webservices.basic.javaclass.Client.main(Client.java:35)

     [java] Caused by: javax.xml.rpc.soap.SOAPFaultException: Service specific exception:
examples.webservices.basic.javaclass.MyException

     [java]     at weblogic.webservice.core.ClientDispatcher.receive(ClientDispatcher.java:313)

     [java]     ... 6 more

  清单 8b: 从动态客户端调用sendSOAPFault()时的SOAP跟踪

    [java] <!-------------------- REQUEST ---------------->

     [java] URL        :  http://localhost:7001/basic_javaclass/HelloWorld?WSDL

     [java] Headers    :

     [java]   SOAPAction: [""]

     [java]   Content-Type: [text/xml]

 

     [java] <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://sche

mas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><en

v:Header/><env:Body env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/

"><m:sendSOAPFault xmlns:m="http://www.bea.com/servers/WebLogic Server70/samples/

examples/webservices/basic/javaclass"/></env:Body></env:Envelope>

     [java] <!-------------------- END REQUEST ------------>

     [java] <!-------------------- RESPONSE --------------->

     [java] URL           : http://localhost:7001/basic_javaclass/HelloWorld?WSDL

     [java] Response Code :500

     [java] Headers       :

     [java]   Date=Wed, 23 Jun 2004 21:23:15 GMT

     [java]   Server=WebLogic Server 8.1 SP2 Fri Dec 5 15:01:51 PST 2003 316284 with CR182483

     [java]   Content-Length=730

     [java]   Content-Type=text/xml; charset=utf-8

     [java] Envelope   :

     [java] <?xml version="1.0" encoding="utf-8" standalone="yes"?><env:Envelope

 xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.

org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/enco

ding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><env:Header/><env:Body><env:

Fault><faultcode>env:Server</faultcode><faultstring>Service specific exception:

examples.webservices.basic.javaclass.MyException</faultstring><detail><MyExcepti

on xmlns:n1="java:examples.webservices.basic.javaclass" xsi:type="n1:MyException

"><errorId xsi:type="xsd:int">10</errorId><errorMessage xsi:type="xsd:string">se

ndSOAPFault() call fails !</errorMessage></MyException></detail></env:Fault></en

v:Body></env:Envelope>

     [java] <!-------------------- END RESPONSE ----------->

     [java] [Client] Fault Detail : <detail>

     [java]  <MyException   xmlns:n1="java:examples.webservices.basic.javaclass"

 

     [java]    xsi:type="n1:MyException">

     [java]   <errorId    xsi:type="xsd:int">10</errorId>

     [java] javax.xml.rpc.soap.SOAPFaultException: Service specific exception:

examples.webservices.basic.javaclass.MyException

     [java]     at weblogic.webservice.core.ClientDispatcher.receive(ClientDispatcher.java:313)

     [java]   <errorMessage    xsi:type="xsd:string">sendSOAPFault() call fails!</errorMessage>

     [java]     at weblogic.webservice.core.ClientDispatcher.dispatch(ClientDispatcher.java:144)

     [java]     at weblogic.webservice.core.DefaultOperation.invoke(DefaultOperation.java:457)

     [java]  </MyException>

     [java] </detail>

     [java] [Client] Fault Actor : null

     [java] [Client] Fault String : Service specific exception: examples.webservices.basic.

javaclass.MyException

     [java]     at weblogic.webservice.core.DefaultOperation.invoke(DefaultOperation.java:443)

     [java]     at weblogic.webservice.core.rpc.CallImpl.invoke(CallImpl.java:558)

     [java]     at weblogic.webservice.core.rpc.CallImpl.invoke(CallImpl.java:411)

     [java]     at examples.webservices.basic.javaclass.DynamicClient.main(DynamicClient.java:39)

  疑难解答技巧
  a) 使用 weblogic.webservice.verbose=true
要在线上获得SOAP跟踪消息,在执行Java客户端程序时,使用weblogic.webservice.verbose=true 命令行参数. 这个跟踪记录帮助理解在请求/响应消息中,什么被发送/接收。例如,运行以下ant任务:

  <target name="run">

    <java classname="examples.webservices.basic.javaclass.Client"

          fork="true">

      <arg value="http://localhost:/basic_javaclass/HelloWorld?WSDL"/>

      <jvmarg value="-Dweblogic.webservice.verbose=true" />

 

      <classpath>

        <pathelement location="/"/>

        <pathelement path=""/>

        <pathelement path=""/>

      </classpath>

    </java>

  </target>

  通过以下方式获得SOAP 请求/响应消息的跟踪:

    [java] <!-------------------- REQUEST ---------------->

     [java] URL        :  http://localhost:7001/basic_javaclass/HelloWorld?WSDL

     [java] Headers    :

     [java]   SOAPAction: [""]

     [java]   Content-Type: [text/xml]

 

     [java] <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://sche

mas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><en

v:Header/><env:Body env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/

"><m:sendSOAPFault xmlns:m="http://www.bea.com/servers/WebLogic Server70/samples/examples/we

bservices/basic/javaclass"/></env:Body></env:Envelope>

     [java] <!-------------------- END REQUEST ------------>

     [java] <!-------------------- RESPONSE --------------->

     [java] URL           : http://localhost:7001/basic_javaclass/HelloWorld?WSDL

     [java] Response Code :500

     [java] Headers       :

     [java]   Date=Wed, 23 Jun 2004 21:23:15 GMT

     [java]   Server=WebLogic Server 8.1 SP2 Fri Dec 5 15:01:51 PST 2003 316284 with CR182483

     [java]   Content-Length=730

     [java]   Content-Type=text/xml; charset=utf-8

     [java] Envelope   :

     [java] <?xml version="1.0" encoding="utf-8" standalone="yes"?><env:Envelope

 xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.

org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/enco

ding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><env:Header/><env:Body><env:

Fault><faultcode>env:Server</faultcode><faultstring>Service specific exception:

examples.webservices.basic.javaclass.MyException</faultstring><detail><MyExcepti

on xmlns:n1="java:examples.webservices.basic.javaclass" xsi:type="n1:MyException

"><errorId xsi:type="xsd:int">10</errorId><errorMessage xsi:type="xsd:string">se

ndSOAPFault() call fails !</errorMessage></MyException></detail></env:Fault></en

v:Body></env:Envelope>

     [java] <!-------------------- END RESPONSE ----------->

  b) 使用weblogic.webservice.tools.debug.Post 实用工具
  使用weblogic.webservice.tools.debug.Post实用工具直接发送SOAP 请求给SOAP服务器。这提供了一种快捷且简便的方法,无需编写客户端程序。要获得更加详细的信息,请参阅 http://e-docs.bea.com/wls/docs81/webserv/trouble.html#1066132。利用这个实用工具,可以在文本编辑器中直接编辑SOAP消息,然后重新发送,观察这些改动在服务器端引起的响应。

  原文出处:http://dev2dev.bea.com/technologies/webservices/articles/websvcs_mysore.jsp

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有