Web-сервис, генерирующий исключение с использованием Axis2 Java - PullRequest
2 голосов
/ 10 октября 2008

Я на самом деле разрабатываю веб-сервис на Java с использованием Axis 2. Я разработал свой сервис как POJO (простой старый Java-объект) с открытым методом, генерирующим исключения:

public class MyService {
   public Object myMethod() throws MyException {
        [...]
   }
}

Затем я сгенерировал WSDL с помощью Ant-задачи Axis2. С помощью WSDL я генерирую клиентскую заглушку для тестирования моего сервиса. Сгенерированный код содержит «MyExceptionException» и «myMethod» в заглушке объявить, чтобы бросить это:

public class MyServiceStub extends org.apache.axis2.client.Stub {
    [...]
    public MyServiceStub.MyMethodResponse myMethod(MyServiceStub.MyMethod myMethod)
    throws java.rmi.RemoteException, MyExceptionException0 {
        [...]
    }
    [...]
}

Но при вызове метода, окруженного перехватом, MyExceptionException никогда не передается сервером, который вместо этого передает AxisFault (подкласс RemoteException).

Я предполагаю, что проблема на стороне сервера, но не могу найти где. Служба развернута в виде файла aar в веб-приложении axis2 на сервере tomcat 5.5. Services.xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<service name="MyService" scope="application">
    <description></description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" 
            class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
           class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass">MyService</parameter>
    <parameter name="ServiceTCCL">composite</parameter>
</service>

Если поведение нормальное, тогда я откажусь от использования Исключений (что не является жизненно важным для моего проекта), но я осмотрительно, почему Java2WSDL генерирует пользовательский в объявлении ввода-вывода операции, а WSDL2Java генерирует Исключительный класс (и объявите, чтобы бросить его в метод заглушки), если это не может быть использовано ...

Ответы [ 3 ]

4 голосов
/ 10 октября 2008

Я не думаю, что есть проблема. Ваш клиент вызывает метод на сервере. Этот метод приводит к исключению. Axis преобразует это исключение во что-то, что может быть отправлено клиенту для указания ошибки.

Все исключения, насколько мне известно, заключены в AxisFault, который затем передается клиенту как, я полагаю, сообщение SoapFault с описанием сообщения об исключении.

Другими словами, клиент должен видеть только AxisFaults, поскольку исключение (класс исключения) не сериализуется и не отправляется. Серверные исключения должны стать AxisFaults на стороне клиента.

1 голос
/ 27 мая 2010

Если ваш WSDL указывает, что ваша служба выдает пользовательскую ошибку, ваш клиент должен ожидать обработки этих ошибок, а также общих удаленных исключений, генерируемых операцией Axis2.

Когда ваша заглушка получает AxisFault с сервера, она пытается создать пользовательское исключение, если это указано в вашем WSDL. Если это не удастся, то вместо этого просто потеряет AxisFault.

Заглушка попытается вызвать f.getDetail (). Если это значение равно NULL, оно не будет пытаться создать пользовательское исключение и пропустит AxisFault. В Axis2 1.5 автоматически сгенерированный MessageInOutReciver на стороне сервера не устанавливает это значение по умолчанию.

Вы можете установить его вручную на стороне сервера следующим образом (при условии, что у вас автоматически сгенерированы классы MyFaultException и MyFault):

        MyFaultException ex = new MyFaultException("My Exception Message");
        MyFault fault = new MyFault();
        fault.setMyFault("My Fault Message");
        ex.setFaultMessage(fault);
        throw ex; 
1 голос
/ 19 ноября 2009

Вы пробовали использовать Axis2 с Lady4j, это решило эту проблему для нас.

...