Web-сервис, генерирующий исключение при использовании Axis2 Java
-
08-07-2019 - |
Вопрос
Я на самом деле разрабатываю веб-сервис на 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;