На самом деле я разрабатываю веб-службу на 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 генерирует класс исключения ( и объявите, что бросили его в метод-заглушку), если это не годится ...




Я действительно не думаю, что это проблема. Ваш Клиент вызывает метод на сервере. Этот метод приводит к исключению. Axis преобразует это исключение во что-то, что может быть отправлено клиенту для индикации ошибки.
Насколько мне известно, все исключения заключены в AxisFault, который затем передается клиенту как, как мне кажется, сообщение SoapFault с описанием сообщения об исключении.
Другими словами, клиент должен видеть только AxisFaults, поскольку исключение (класс исключения) не сериализуется и не отправляется. Исключения сервера должны стать AxisFaults на стороне клиента.
В клиентской заглушке проблема, похоже, в том, что org.apache.axiom.om.OMElement faultElt = f.getDetail (); возвращает null ... поэтому заглушка не может сопоставить ошибку оси с пользовательским исключением Java (которое генерируется из WSDL) ...
похоже на ошибку для меня. Если метод явно объявляет свои исключения, то эти исключения должны быть сериализованы и переданы соответствующим образом. Даже генератор клиента веб-сервиса оси eclipse генерирует классы исключений в клиенте. ИМО
Вы пробовали использовать Axis2 с Lady4j, это решило эту проблему для нас.
как lady4j может здесь помочь?
Если ваш 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?
В коде, сгенерированном на стороне сервера, он генерирует AxisFault и добавляет в контекст SOAP org.apache.axis2.Constants.FAULT_NAME для сопоставления настраиваемой ошибки в WSDL ...