Пользовательский код ошибки с использованием Axis2 - PullRequest
2 голосов
/ 25 августа 2010

Я создал веб-сервис и использовал Axis2 для генерации всех «скелетных» Java-классов. Тогда я, конечно, сам реализовал сервисные операции.

В реализации я могу создать исключение MyException, которое затем перехватывается сгенерированными классами и преобразуется в объект AxisFault, который, в свою очередь, преобразуется в мыльную ошибку (в глубине структуры Axis) с атрибутом <faultcode>soapenv:Server</faultcode>

Моя проблема в том, что мне нужен пользовательский динамический код ошибки, а не "soapenv: Server".

Я пытался вручную создать объект AxisFault и выдать его, но AxisFault - это RemoteException, и сгенерированный интерфейс, который должна реализовать моя реализация, не позволяет выбрасывать RemoteException.

Можно ли получить какой-то хук или фильтр на выходе, чтобы я мог изменить код ошибки? Или любой другой способ контролировать код ошибки?

Заранее спасибо
Ульрик

1 Ответ

4 голосов
/ 25 августа 2010

Спецификация SOAP описывает, как пользовательская информация об ошибках отображается под тегом detail . код ошибки - это фиксированный набор значений, определяющий, где при обработке SOAP возникла ошибка.

Ниже приведен пример выдачи пользовательского сообщения об ошибке

1011 * 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>
...