Исключение выброса веб-службы с использованием Axis2 Java

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

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

Затем я сгенерировал WSDL, используя задачу Axis2 ant. С помощью 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 в веб-приложении оси2 на сервере 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> в объявлении ввода и вывода операции, а WSDL2Java генерирует класс исключения ( и объявите, что бросили его в метод-заглушку), если это не годится ...

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
13 700
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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

В коде, сгенерированном на стороне сервера, он генерирует AxisFault и добавляет в контекст SOAP org.apache.axis2.Constants.FAULT_NAME для сопоставления настраиваемой ошибки в WSDL ...

Vinze 13.01.2009 17:04

В клиентской заглушке проблема, похоже, в том, что org.apache.axiom.om.OMElement faultElt = f.getDetail (); возвращает null ... поэтому заглушка не может сопоставить ошибку оси с пользовательским исключением Java (которое генерируется из WSDL) ...

Vinze 13.01.2009 17:05

похоже на ошибку для меня. Если метод явно объявляет свои исключения, то эти исключения должны быть сериализованы и переданы соответствующим образом. Даже генератор клиента веб-сервиса оси eclipse генерирует классы исключений в клиенте. ИМО

user1073494 15.01.2014 22:09

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

как lady4j может здесь помочь?

user1073494 15.01.2014 22:05

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

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

Заглушка попытается вызвать f.getDetail (). Если это значение равно нулю, он не будет пытаться создать настраиваемое исключение и передаст 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; 

MyFaultException должен расширять какой класс, чтобы иметь доступ к setFaultMessage?

user1073494 15.01.2014 22:04

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