Как вернуть (настраиваемый) SOAPFault из веб-службы Axis? - PullRequest
6 голосов
/ 12 июня 2011

У меня есть несколько 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 ...

1 Ответ

3 голосов
/ 12 июня 2011

Ваш второй пост кода является ошибкой 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 , который обеспечивает полную настройку всех поведений в стеке (сортировка, выполняемый компонент и т. Д.).

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

...