Обработка ошибок в SOAP веб-сервисе на стороне клиента
Обработка ошибок (exception) soap веб-сервиса на стороне клиента.
Используемые технологии и библиотеки
- Apache CXF 3.1.6
- Spring MVC 4.3.0.Release
1. Описание задачи
Создать и обработать исключение на стороне сервера при использовании SOAP веб-сервиса. Для этой статьи есть описание клиентской стороны, тестирующий данный код.
2. Структура проекта
В проекте добавлены сгенерированные на основании wsdl описания веб-сервиса Java классы. Описание веб-сервиса доступна по адресу http://localhost:8080/soap/webserviceSEI?wsdl. Под катом описание веб-сервиса, который рассмотрен в предыдущей части.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
This XML file does not appear to have any style information associated with it. The document tree is shown below. <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://soap.ws.javastudy.ru/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="HelloSoap" targetNamespace="http://soap.ws.javastudy.ru/"> <wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://soap.ws.javastudy.ru/" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://soap.ws.javastudy.ru/"> <xs:element name="exceptionTest" type="tns:exceptionTest"/> <xs:element name="exceptionTestResponse" type="tns:exceptionTestResponse"/> <xs:element name="getGoods" type="tns:getGoods"/> <xs:element name="getGoodsResponse" type="tns:getGoodsResponse"/> <xs:element name="goods" type="tns:goods"/> <xs:element name="sayHelloTo" type="tns:sayHelloTo"/> <xs:element name="sayHelloToResponse" type="tns:sayHelloToResponse"/> <xs:element name="testService" type="tns:testService"/> <xs:element name="testServiceResponse" type="tns:testServiceResponse"/> <xs:complexType name="testService"> <xs:sequence/> </xs:complexType> <xs:complexType name="testServiceResponse"> <xs:sequence> <xs:element minOccurs="0" name="return" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="getGoods"> <xs:sequence/> </xs:complexType> <xs:complexType name="getGoodsResponse"> <xs:sequence> <xs:element minOccurs="0" name="return" type="tns:goods"/> </xs:sequence> </xs:complexType> <xs:complexType name="goods"> <xs:sequence> <xs:element name="id" type="xs:int"/> <xs:element minOccurs="0" name="name" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="sayHelloTo"> <xs:sequence> <xs:element minOccurs="0" name="text" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="sayHelloToResponse"> <xs:sequence> <xs:element minOccurs="0" name="return" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="exceptionTest"> <xs:sequence> <xs:element minOccurs="0" name="text" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="exceptionTestResponse"> <xs:sequence/> </xs:complexType> <xs:complexType name="exceptionTrace"> <xs:sequence> <xs:element minOccurs="0" name="trace" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name="MyWebserviceException" type="tns:MyWebserviceException"/> <xs:complexType name="MyWebserviceException"> <xs:sequence> <xs:element minOccurs="0" name="exceptionTrace" type="tns:exceptionTrace"/> <xs:element minOccurs="0" name="message" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema> </wsdl:types> <wsdl:message name="testService"> <wsdl:part element="tns:testService" name="parameters"></wsdl:part> </wsdl:message> <wsdl:message name="exceptionTestResponse"> <wsdl:part element="tns:exceptionTestResponse" name="parameters"></wsdl:part> </wsdl:message> <wsdl:message name="getGoods"> <wsdl:part element="tns:getGoods" name="parameters"></wsdl:part> </wsdl:message> <wsdl:message name="testServiceResponse"> <wsdl:part element="tns:testServiceResponse" name="parameters"></wsdl:part> </wsdl:message> <wsdl:message name="sayHelloTo"> <wsdl:part element="tns:sayHelloTo" name="parameters"></wsdl:part> </wsdl:message> <wsdl:message name="exceptionTest"> <wsdl:part element="tns:exceptionTest" name="parameters"></wsdl:part> </wsdl:message> <wsdl:message name="getGoodsResponse"> <wsdl:part element="tns:getGoodsResponse" name="parameters"></wsdl:part> </wsdl:message> <wsdl:message name="MyWebserviceException"> <wsdl:part element="tns:MyWebserviceException" name="MyWebserviceException"></wsdl:part> </wsdl:message> <wsdl:message name="sayHelloToResponse"> <wsdl:part element="tns:sayHelloToResponse" name="parameters"></wsdl:part> </wsdl:message> <wsdl:portType name="WebserviceSEI"> <wsdl:operation name="testService"> <wsdl:input message="tns:testService" name="testService"></wsdl:input> <wsdl:output message="tns:testServiceResponse" name="testServiceResponse"></wsdl:output> </wsdl:operation> <wsdl:operation name="getGoods"> <wsdl:input message="tns:getGoods" name="getGoods"></wsdl:input> <wsdl:output message="tns:getGoodsResponse" name="getGoodsResponse"></wsdl:output> </wsdl:operation> <wsdl:operation name="sayHelloTo"> <wsdl:input message="tns:sayHelloTo" name="sayHelloTo"></wsdl:input> <wsdl:output message="tns:sayHelloToResponse" name="sayHelloToResponse"></wsdl:output> </wsdl:operation> <wsdl:operation name="exceptionTest"> <wsdl:input message="tns:exceptionTest" name="exceptionTest"></wsdl:input> <wsdl:output message="tns:exceptionTestResponse" name="exceptionTestResponse"></wsdl:output> <wsdl:fault message="tns:MyWebserviceException" name="MyWebserviceException"></wsdl:fault> </wsdl:operation> </wsdl:portType> <wsdl:binding name="HelloSoapSoapBinding" type="tns:WebserviceSEI"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="testService"> <soap:operation soapAction="" style="document"/> <wsdl:input name="testService"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="testServiceResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getGoods"> <soap:operation soapAction="" style="document"/> <wsdl:input name="getGoods"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="getGoodsResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="sayHelloTo"> <soap:operation soapAction="" style="document"/> <wsdl:input name="sayHelloTo"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="sayHelloToResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="exceptionTest"> <soap:operation soapAction="" style="document"/> <wsdl:input name="exceptionTest"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="exceptionTestResponse"> <soap:body use="literal"/> </wsdl:output> <wsdl:fault name="MyWebserviceException"> <soap:fault name="MyWebserviceException" use="literal"/> </wsdl:fault> </wsdl:operation> </wsdl:binding> <wsdl:service name="HelloSoap"> <wsdl:port binding="tns:HelloSoapSoapBinding" name="HelloSoapPort"> <soap:address location="http://localhost:8080/soap/webserviceSEI"/> </wsdl:port> </wsdl:service> </wsdl:definitions> |
3. Генерация Java классов
Все классы были сгенерированы автоматически с помощью утилиты wsimport из JDK 1.8. Как это делается описано в Создание Java классов на основании wsdl описания soap веб-сервиса с помощью wsimport. Ниже приведен текст из терминала IntelliJ IDEA, который был использован для генерации этих классов (отмечу, что путь у вас будет разумеется другой, но общий вид может кому-то помочь).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
Microsoft Windows [Version 6.3.9600] (c) Корпорация Майкрософт (Microsoft Corporation), 2013. Все права защищены. C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Excep tion>cd C:\Program Files\Java\jdk1.8.0_91\bin C:\Program Files\Java\jdk1.8.0_91\bin>wsimport.exe -d "C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java" - keep -verbose http://localhost:8080/soap/webserviceSEI?wsdl parsing WSDL... Generating code... ru\javastudy\ws\soap\ExceptionTest.java ru\javastudy\ws\soap\ExceptionTestResponse.java ru\javastudy\ws\soap\ExceptionTrace.java ru\javastudy\ws\soap\GetGoods.java ru\javastudy\ws\soap\GetGoodsResponse.java ru\javastudy\ws\soap\Goods.java ru\javastudy\ws\soap\HelloSoap.java ru\javastudy\ws\soap\MyWebserviceException.java ru\javastudy\ws\soap\MyWebserviceException_Exception.java ru\javastudy\ws\soap\ObjectFactory.java ru\javastudy\ws\soap\SayHelloTo.java ru\javastudy\ws\soap\SayHelloToResponse.java ru\javastudy\ws\soap\TestService.java ru\javastudy\ws\soap\TestServiceResponse.java ru\javastudy\ws\soap\WebserviceSEI.java ru\javastudy\ws\soap\package-info.java Compiling code... javac -d C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java -classpath C:\Program Files\Java\jdk1.8.0_91/lib /tools.jar;C:\Program Files\Java\jdk1.8.0_91/classes -Xbootclasspath/p:C:\Program Files\Java\jdk1.8.0_91\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_91\jr e\lib\rt.jar C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy\ws\soap\ExceptionTest.java C:\U sers\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy\ws\soap\ExceptionTestResponse.java C:\Users\iMac PC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy\ws\soap\ExceptionTrace.java C:\Users\iMacPC\Documents\Jav aStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy\ws\soap\GetGoods.java C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services \SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy\ws\soap\GetGoodsResponse.java C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptio ns\Client Exception\src\main\java\ru\javastudy\ws\soap\Goods.java C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\m ain\java\ru\javastudy\ws\soap\HelloSoap.java C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy \ws\soap\MyWebserviceException.java C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy\ws\soap\ MyWebserviceException_Exception.java C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy\ws\soap \ObjectFactory.java C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy\ws\soap\SayHelloTo.java C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy\ws\soap\SayHelloToResponse.java C:\Users\iMa cPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy\ws\soap\TestService.java C:\Users\iMacPC\Documents\JavaS tudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy\ws\soap\TestServiceResponse.java C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Exceptions\Client Exception\src\main\java\ru\javastudy\ws\soap\WebserviceSEI.java C:\Users\iMacPC\Documents\JavaStudy.ru\Web Services\SOAP\Ex ceptions\Client Exception\src\main\java\ru\javastudy\ws\soap\package-info.java C:\Program Files\Java\jdk1.8.0_91\bin> |
Описание сгенерированных классов не входит в тему статьи и вы можете посмотреть их скачав проект в конце статьи.
4. Клиент SOAP веб-сервиса
Был создан простой main класс, в котором вызывается веб-сервис описанный в первой статье (серверная часть).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package ru.javastudy.main; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import ru.javastudy.ws.soap.MyWebserviceException_Exception; import ru.javastudy.ws.soap.WebserviceSEI; import javax.xml.ws.Endpoint; /** * Created for JavaStudy.ru on 18.06.2016. */ public class ClientMain { public static void main(String[] args) { String soapURL = "http://localhost:8080/soap/webserviceSEI"; JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean(); factoryBean.setServiceClass(WebserviceSEI.class); factoryBean.setAddress(soapURL); WebserviceSEI sei = (WebserviceSEI) factoryBean.create(); String result = sei.sayHelloTo("Hello from client!"); System.out.println(""); System.out.println("NEXT WILL TEST EXCEPTION"); System.out.println(""); try { sei.exceptionTest("CALL METHOD TO GET EXCEPTION"); } catch (MyWebserviceException_Exception e) { System.out.println("TRY CATCH method:"); e.printStackTrace(); } } } |
После запуска мы увидим следующее сообщение:
На стороне клиента:
1 2 3 4 5 6 7 8 9 10 11 12 |
INFO: Creating Service {http://soap.ws.javastudy.ru/}WebserviceSEIService from class ru.javastudy.ws.soap.WebserviceSEI NEXT WILL TEST EXCEPTION TRY CATCH method: ru.javastudy.ws.soap.MyWebserviceException_Exception: CALL METHOD TO GET EXCEPTION at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62 ..... Process finished with exit code 0 |
Как видите выводится ошибка с типом MyWebserviceException_Exception и переданным внутрь параметром (String text = ‘CALL METHOD TO GET EXCEPTION’).
На стороне сервера:
1 2 3 4 5 |
HelloSoap exceptionTest.. 23-Jun-2016 00:09:36.740 INFO [http-apr-8080-exec-10] org.apache.cxf.phase.PhaseInterceptorChain.doDefaultLogging Application {http://soap.ws.javastudy.ru/}HelloSoap#{http://soap.ws.javastudy.ru/}exceptionTest has thrown exception, unwinding now: ru.javastudy.ws.exceptions.MyWebserviceException: CALL METHOD TO GET EXCEPTION |