Как вернуть (настраиваемый) SOAPFault из веб-службы Axis?

У меня есть WSDL, из которого мне нужно создать реализацию веб-службы. Я использую Eclipse и Axis1.4 и работаю на Weblogic9.2.

Генерация серверных заглушек проходит нормально, и я реализовал необходимый код. Однако для совместимости с существующей реализацией, которую мы эмулируем, мне нужно возвращать ошибки SOAP для некоторых указанных условий ошибки.

То есть мне нужно, чтобы SOAP-тело ответа выглядело как в этом примере:

<soapenv:Body>
    <soapenv:Fault>
        <faultcode xmlns:ns1="foobar">ns1:1234</faultcode>
        <faultstring>The supplied parameter name ABCD is not recognised.</faultstring>
        <detail>
            <FaultDetail>An error processing the web service [MyService]: Unknown parameter:ABCD</FaultDetail>
            <ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">planet</ns2:hostname>
        </detail>
    </soapenv:Fault>
</soapenv:Body>

Из (большого) поиска в Google я думаю, что смогу сделать это, бросив исключение SOAPFaultException. Но заглушка сообщения выдает только java.rmi.RemoteException, поэтому я попытался передать SOAPFaultException в RemoteException. Это дает мне что-то вроде этого:

   <soapenv:Body>
      <soapenv:Fault>
         <faultcode>soapenv:Server.userException</faultcode>
         <faultstring>java.rmi.RemoteException: My remote exception; nested exception is: 
    javax.xml.rpc.soap.SOAPFaultException: soap fault string</faultstring>
         <detail>
            <ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">myhostname</ns1:hostname>
         </detail>
      </soapenv:Fault>
   </soapenv:Body>

... другими словами, это не привело к ошибке SOAP.

Я пробовал много других вещей, и я в значительной степени застрял. Итак, может ли кто-нибудь сказать мне (в идеале с примером), как вернуть ответ об ошибке SOAP с содержимым, которое я могу указать, в моей среде?

Я не привязан к использованию Axis (но у меня больше опыта с этим, чем с чем-либо еще). Если вы предлагаете альтернативу, обратите внимание, что мне нужно в методе веб-службы вызвать другую (аутентифицированную) веб-службу, и я смог заставить ее работать только в Axis1.4...


person The Archetypal Paul    schedule 12.06.2011    source источник


Ответы (1)


Ваш второй кодовый пост - это ошибка SOAP (обратите внимание на soapenv:Fault внутри soapenv:Body).

По сути, все фреймворки по умолчанию возвращают стандартную ошибку SOAP и предоставляют вам возможность вводить собственную информацию в поля кода ошибки, строки ошибки и сведений об ошибке.

См. документацию по исключению оси 1: http://ws.apache.org/axis/java/apiDocs/org/apache/axis/AxisFault.html

У него есть конструкторы для установки qname различных полей, поэтому вы должны иметь возможность ссылаться там на свои собственные элементы.

Многие люди будут использовать поле сведений об ошибке и сериализовать в нем свой собственный XML-тип с помощью DOM.

И последнее, но не менее важное: лучшее время для Axis1 было примерно в 2000–2004 годах, и вам будет трудно получить ответы и поддержку в связи с этим. Большинство людей перешли с Axis1 на Apache CXF, Axis2 или просто вверх
JAX-WS (теперь включено в JDK6+). Существует также проект Spring Web Services, обеспечивающий полную настройку всех вариантов поведения в стек (маршаллинг, какой bean-компонент выполняется и т. д.).

Просто все эти платформы используют WSS4J для обеспечения безопасности своих веб-сервисов и могут поддерживать стандартный токен имени пользователя, токен x509 и т. д. вероятно, придется проработать детали WS-Security.

person Al Baker    schedule 12.06.2011
comment
Спасибо. Мне удалось пропустить, что это была ошибка SOAP. Я до сих пор не совсем понимаю, как получить там собственную информацию, хотя, насколько я понимаю, я могу только вызвать RemoteException в методе, поэтому я могу создать AxisException, но я не вижу, как это сделать. бросьте это.... В любом случае, поэкспериментируйте еще немного. Что касается возраста Axis1, да, я согласен, но, несмотря на то, что я много играл, я так и не получил аутентификацию с помощью Axis2, и я не могу найти ничего подробного о повышении SOAPFaults с помощью CXF. Weblogic9.2 (с которым я застрял) - это Java1.5, поэтому прямой вариант JAX-WS тоже отсутствует. - person The Archetypal Paul; 12.06.2011
comment
D'dh, с вашей связанной страницы: открытый класс AxisFault расширяет java.rmi.RemoteException. пойду экспериментировать... - person The Archetypal Paul; 12.06.2011
comment
Эксперимент удался. Выброс AxisFault с тщательно созданным XML для деталей работал отлично. Спасибо! - person The Archetypal Paul; 12.06.2011