Web-сервис, генерирующий исключение при использовании Axis2 Java

StackOverflow https://stackoverflow.com/questions/191826

Вопрос

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

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

Затем я сгенерировал WSDL с помощью задачи Ant Axis2. С помощью WSDL я генерирую клиентскую заглушку для тестирования моего сервиса. Сгенерированный код содержит & Quot; MyExceptionException & Quot; и " 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 генерирует пользовательские < wsdl: fault > в операции ввода & amp; выходное объявление и WSDL2Java генерируют класс Exception (и объявляют, что он выбрасывает его в метод-заглушку), если это невозможно использовать ...

Это было полезно?

Решение

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

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

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

Другие советы

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

Если ваш 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; 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top