使用Axis2自定义故障代码

时间:2010-08-25 15:18:41

标签: web-services soap axis2

我创建了一个Web服务,并使用Axis2生成所有“骨架”java类。然后我当然自己实施了服务操作。

在实现中,我可以抛出一个MyException,然后由生成的类捕获并转换为AxisFault对象,而AxisFault对象又转换为soap fault(在Axis框架的内部),属性为{{1 }}

我的问题是我想要一个自定义动态故障代码,而不是“soapenv:Server”。

我试图手动创建一个AxisFault对象并抛出它,但是AxisFault是一个RemoteException,我实现必须实现的生成的接口不允许抛出RemoteException。

是否可以在输出上获得某种钩子或过滤器,以便我可以更改故障码?或者以其他方式控制故障码?

提前致谢
Ulrik合作

1 个答案:

答案 0 :(得分:4)

SOAP specification描述了详细信息标记下自定义错误信息的显示方式。 faultcode 是一组固定的值,用于处理SOAP处理中抛出错误的位置。

以下是抛出自定义错误消息的示例

WSDL

声明WSDL中的错误,以便生成关联的类:

<wsdl:definitions targetNamespace="http://example"
    xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:tns="http://example"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:types>
        <schema elementFormDefault="qualified" targetNamespace="http://example"
            xmlns="http://www.w3.org/2001/XMLSchema"
            xmlns:apachesoap="http://xml.apache.org/xml-soap"
            xmlns:tns="http://example" xmlns:intf="http://example"
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

            <element name="withdraw">
                <complexType>
                    <sequence>
                        <element name="account" type="xsd:string"/>
                        <element name="amount" type="xsd:int"/>
                    </sequence>
                </complexType>
            </element>

            <element name="withdrawResponse">
                <complexType>
                    <sequence>
                        <element name="balance" type="xsd:int"/>
                    </sequence>
                </complexType>
            </element>

            <element name="AccountNotExistFault">
                <complexType>
                    <sequence>
                        <element name="account" type="xsd:string"/>
                    </sequence>
                </complexType>
            </element>

            <element name="InsufficientFundFault">
                <complexType>
                    <sequence>
                        <element name="account" type="xsd:string"/>
                        <element name="balance" type="xsd:int"/>
                        <element name="requestedFund" type="xsd:int"/>
                    </sequence>
                </complexType>
            </element>

        </schema>
    </wsdl:types>

    <wsdl:message name="withdrawRequest">
        <wsdl:part element="tns:withdraw" name="parameters"/>
    </wsdl:message>

    <wsdl:message name="withdrawResponse">
        <wsdl:part element="tns:withdrawResponse" name="return"/>
    </wsdl:message>

    <wsdl:message name="InsufficientFundFaultMessage">
        <wsdl:part element="tns:InsufficientFundFault" name="fault"/>
    </wsdl:message>

    <wsdl:message name="AccountNotExistFaultMessage">
        <wsdl:part element="tns:AccountNotExistFault" name="fault"/>
    </wsdl:message>

    <wsdl:portType name="Bank">
        <wsdl:operation name="withdraw">
            <wsdl:input message="tns:withdrawRequest" name="withdrawRequest"/>
            <wsdl:output message="tns:withdrawResponse" name="withdrawResponse"/>
            <wsdl:fault message="tns:AccountNotExistFaultMessage" name="AccountNotExistException"/>
            <wsdl:fault message="tns:InsufficientFundFaultMessage" name="InsufficientFundException"/>
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="BankSoapBinding" type="tns:Bank">
        <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="withdraw">
            <wsdlsoap:operation soapAction=""/>
            <wsdl:input name="withdrawRequest">
                <wsdlsoap:body use="literal"/>
            </wsdl:input>
            <wsdl:output name="withdrawResponse">
                <wsdlsoap:body use="literal"/>
            </wsdl:output>
            <wsdl:fault name="InsufficientFundException">
                <wsdlsoap:fault name="InsufficientFundException" use="literal"/>
            </wsdl:fault>
            <wsdl:fault name="AccountNotExistException">
                <wsdlsoap:fault name="AccountNotExistException" use="literal"/>
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>

    <wsdl:service name="BankService">
        <wsdl:port binding="tns:BankSoapBinding" name="Bank">
            <wsdlsoap:address location="http://localhost:8080/bank/services/Bank"/>
        </wsdl:port>
    </wsdl:service>

</wsdl:definitions>

服务代码

以下代码演示了如何抛出自定义错误消息:

package example;

public class BankServiceSkeleton {

    public  WithdrawResponse withdraw(Withdraw param1) throws InsufficientFundFaultMessage, AccountNotExistFaultMessage {

        //
        // Parameter handling
        //
        String account = param1.getAccount();
        int amount     = param1.getAmount();

        //
        // Error checks
        //
        if ("13".equals(account)) {
            AccountNotExistFault fault = new AccountNotExistFault();

            fault.setAccount(account);

            AccountNotExistFaultMessage ex = new AccountNotExistFaultMessage("Account does not exist!");
            ex.setFaultMessage(fault);
            throw ex;
        }

        if (amount > 1000) {
            InsufficientFundFault fault = new InsufficientFundFault();

            fault.setAccount(account);
            fault.setBalance(1000);
            fault.setRequestedFund(amount);

            InsufficientFundFaultMessage ex = new InsufficientFundFaultMessage("Insufficient funds");
            ex.setFaultMessage(fault);
            throw ex;
        }

        //
        // Normal response
        //
        WithdrawResponse response = new WithdrawResponse();

        response.setBalance(1000 - amount);

        return response;
    }
}

测试

以下SOAP消息

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:exam="http://example">
   <soapenv:Header/>
   <soapenv:Body>
      <exam:withdraw>
         <exam:account>10</exam:account>
         <exam:amount>2000</exam:amount>
      </exam:withdraw>
   </soapenv:Body>
</soapenv:Envelope>

生成以下SOAP错误响应

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <soapenv:Fault>
         <faultcode>soapenv:Server</faultcode>
         <faultstring>Insufficient funds</faultstring>
         <detail>
            <ns1:InsufficientFundFault xmlns:ns1="http://example">
               <ns1:account>10</ns1:account>
               <ns1:balance>1000</ns1:balance>
               <ns1:requestedFund>2000</ns1:requestedFund>
            </ns1:InsufficientFundFault>
         </detail>
      </soapenv:Fault>
   </soapenv:Body>
</soapenv:Envelope>