स्प्रिंग- WS का उपयोग कर SOAP वेब सेवा

छवि
एक बार उन्होंने मेरे लिए वेब सेवाओं को विकसित करना शुरू करने के लिए एक कार्य निर्धारित किया और मुझे बिना किसी स्पष्टीकरण के एक साधारण परियोजना के बारे में बताया। परियोजना, निश्चित रूप से, शुरू नहीं हुई। वसंत क्या है और यह कैसे काम करता है, मुझे भी पता नहीं था। मैं वसंत उपकरणों का उपयोग करके रूसी या अंग्रेजी में वेब सेवाओं के विकास पर कोई पर्याप्त लेख नहीं पा सका। मुझे खुद को सब कुछ समझना था, यह पता चला कि सब कुछ इतना डरावना नहीं था।
और हाल ही में, मैंने यह देखने का फैसला किया कि तब से वसंत में कौन सी नई सुविधाएँ जोड़ी गई हैं और पुरानी सेवाओं को अपडेट किया गया है, जिसके परिणामस्वरूप, मुझे इस लेख को लिखने के लिए प्रोत्साहित किया।

यह लेख स्प्रिंग-डब्लूएस का उपयोग करके एसओएपी प्रोटोकॉल का उपयोग करके एक सरल वेब सेवा विकसित करने के लिए एक गाइड है।

और इसलिए, हम एक साधारण सेवा लिखेंगे जो एक उपयोगकर्ता नाम स्वीकार करती है और सर्वर पर एक ग्रीटिंग और वर्तमान समय भेजती है।

हमें क्या चाहिए?


काम की तैयारी

एक नया वेब एप्लिकेशन प्रोजेक्ट बनाएं। ग्रहण में, यह है: "फ़ाइल => नया => गतिशील वेब प्रोजेक्ट।"
मैंने इस परियोजना को बुलाया: HelloService।
इसके बाद, प्रोजेक्ट डायरेक्टरी WEB-INF / lib में स्प्रिंग, XMLBean, wsdl4j, कॉमन्स-लॉगिंग से पुस्तकालयों की प्रतिलिपि बनाएँ।
यदि आप चाहें, तो आप उन्हें सर्वर पुस्तकालयों में जोड़ सकते हैं, ताकि उन्हें हर एप्लिकेशन के साथ न खींचें।

डब्लूएसडीएल स्कीमा बनाना

संक्षेप में, डब्ल्यूएसडीएल योजना का उद्देश्य सेवा का वर्णन करना है।
बेशक, हम इसे मैन्युअल रूप से नहीं करते हैं। यह योजना स्‍वत: ही जनरेट की जाएगी, लेकिन बाद में और भी।

इनपुट और आउटपुट डेटा का निर्धारण करें

इनपुट डेटा:

आउटपुट डेटा:

इनपुट और आउटपुट डेटा का विवरण बनाएं

WEB-INF निर्देशिका में, HelloService.xsd फ़ाइल बनाएँ। डब्लूएसडीएल योजना बनाने और संबंधित जावा कक्षाएं बनाने के लिए इस फ़ाइल की आवश्यकता होगी।
फ़ाइल पाठ:
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/HelloService" elementFormDefault="qualified"> <element name="ServiceRequest"> <complexType> <sequence> <element name="name" type="string" maxOccurs="1" minOccurs="1"/> </sequence> </complexType> </element> <element name="ServiceResponse"> <complexType> <sequence> <element name="hello" type="string" maxOccurs="1" minOccurs="1"/> <element name="currentTime" type="time" maxOccurs="1" minOccurs="1"/> </sequence> </complexType> </element> </schema> 

TargetNamespace विशेषता उपयोग किए जाने वाले नामस्थान है। यानी सभी बनाए गए ऑब्जेक्ट पैकेज में स्थित होंगे। org.example.helloService।
ServiceRequest और ServiceResponse तत्व क्रमशः इनपुट और आउटपुट डेटा (अनुरोध / प्रतिक्रिया) का वर्णन करते हैं।
मिनोकर्स और मैक्सकोर्स की विशेषताएं एक घटक के भीतर इस घटक की पुनरावृत्ति की संख्या निर्धारित करती हैं। यदि ये पैरामीटर निर्दिष्ट नहीं हैं, तो डिफ़ॉल्ट रूप से उन्हें 1 के बराबर माना जाता है। एक वैकल्पिक घटक के लिए, आपको minOccurs = 0 निर्दिष्ट करना होगा। घटकों की एक असीमित संख्या के साथ: maxOccurs = अबाधित।
XML स्कीमा के बारे में यहाँ और पढ़ें।

JavaBeans बनाएँ

बनाई गई योजना के आधार पर, हम जावा कक्षाएं बनाएंगे। ऐसा करने के लिए, build.xml फ़ाइल बनाएँ:
 <?xml version="1.0" encoding="UTF-8"?> <project name="imsjob" default="build" basedir="."> <property name="WS_HOME" value="C:\AST\lib\standart"/> <property name="encoding" value="UTF-8"/> <path id="xbean.classpath"> <fileset dir="${WS_HOME}"> <include name="*.jar"/> </fileset> </path> <taskdef name="xmlbean" classname="org.apache.xmlbeans.impl.tool.XMLBean" classpathref="xbean.classpath" /> <target name="init"> <echo message="Start init"/> </target> <target name="build" depends="init"> <xmlbean schema="HelloService.xsd" destfile="lib\helloservice.jar" classpathref="xbean.classpath"/> </target> </project> 

WS_HOME पैरामीटर को उस निर्देशिका को इंगित करना चाहिए जहां XMLBeans स्थित है।
HelloService.xsd - बनाई गई योजना का पथ।
lib \ helloservice.jar - जावा-लाइब्रेरी बनाया गया।

अगला, चींटी-निर्माण चलाएं (मुझे आशा है कि आपने पहले ही इसे स्थापित किया है)।
ग्रहण में, आप इसे इस तरह से चला सकते हैं: फ़ाइल build.xml => रन अस => एंट बिल्ड का उपयोग करके आरएमबी।
यदि कमांड लाइन के माध्यम से:
ant -buildfile build.xml
खैर, हम निर्माण पूरा होने का इंतजार कर रहे हैं। उसके बाद, हम उचित लाइब्रेरी (हेलोसोवेर्स.जर) की उपस्थिति के लिए प्रोजेक्ट डायरेक्टरी WEB-INF \ lib की जांच कर सकते हैं।

सेवा कार्यान्वयन

हम इंटरफ़ेस और सेवा की श्रेणी बनाते हैं

सेवा इंटरफ़ेस: HelloService.java:
 package org.example; import java.util.Calendar; public interface HelloService { public String getHello(String name) throws Exception; public Calendar getCurrentTime(); } 

सेवा कार्यान्वयन: HelloServiceImpl.java:
 package org.example; import java.util.Calendar; import org.springframework.stereotype.Service; @Service public class HelloServiceImpl implements HelloService { public String getHello(String name) throws Exception { return "Hello, " + name + "!"; } public Calendar getCurrentTime() { return Calendar.getInstance(); } } 

यह कोड, मुझे लगता है, टिप्पणियों की आवश्यकता नहीं है। केवल एक चीज जो लोग सवाल उठाने से पहले वसंत के साथ नहीं आए हैं वह @ सेवा एनोटेशन है। लेकिन मैं उसी के बारे में थोड़ा बाद में बताऊंगा।

endpoint

समापन बिंदु - एक वर्ग जो आने वाले अनुरोधों (एक प्रकार का प्रवेश बिंदु) के प्रसंस्करण के लिए जिम्मेदार होगा।

फ़ाइल बनाएं HelloServiceEndpoint.java:
 package org.example; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ws.server.endpoint.annotation.Endpoint; import org.springframework.ws.server.endpoint.annotation.PayloadRoot; import org.example.helloService.ServiceRequestDocument; import org.example.helloService.ServiceRequestDocument.ServiceRequest; import org.example.helloService.ServiceResponseDocument; import org.example.helloService.ServiceResponseDocument.ServiceResponse; @Endpoint public class HelloServiceEndpoint{ private static final String namespaceUri = "http://www.example.org/HelloService"; private HelloService helloService; @Autowired public void HelloService (HelloService helloService) { this.helloService = helloService; } @PayloadRoot(localPart = "ServiceRequest", namespace = namespaceUri) public ServiceResponseDocument getService(ServiceRequestDocument request) throws Exception { ServiceRequestDocument reqDoc = request; ServiceRequest req = reqDoc.getServiceRequest(); ServiceResponseDocument respDoc = ServiceResponseDocument.Factory.newInstance(); ServiceResponse resp = respDoc.addNewServiceResponse(); String userName = req.getName(); String helloMessage = testNewService.getHello(userName); Calendar currentTime = testNewService.getCurrentTime(); resp.setHello(helloMessage); resp.setCurrentTime(currentTime); return respDoc; } } 

यहाँ क्या किया गया है?
@Endpoint एनोटेशन केवल यह निर्धारित करता है कि यह वर्ग आने वाले अनुरोधों को संसाधित करेगा।
namespaceUri - वही नामस्थान जो xml- स्कीम बनाते समय निर्दिष्ट किया गया था।

अब थोड़ा पीछे चलते हैं और @ सेवा एनोटेशन याद करते हैं। यदि आप विवरण में नहीं जाते हैं ताकि अनावश्यक जानकारी के साथ पाठक को अधिभार न डालें, तो यह एनोटेशन स्प्रिंग को उचित वस्तु बनाने के लिए कहता है। और @Autowired एनोटेशन इसी वस्तु को इंजेक्ट (स्वचालित रूप से स्थानापन्न) करने का कार्य करता है। बेशक, जब इन एनोटेशन के उपयोग में सरल अनुप्रयोग का निर्माण होता है, तो कोई मतलब नहीं है, लेकिन मैंने इस उदाहरण में उन्हें बाहर नहीं करने का फैसला किया।

और इसलिए, चलो आगे बढ़ते हैं।
विधि के निर्धारण से पहले @PayloadRoot एनोटेशन जब एक अनुरोध प्राप्त होता है कि यह विधि कहा जाएगा। हमारे मामले में, यह "ServiceRequest" है।

अन्यथा, फिर से, सब कुछ स्पष्ट होना चाहिए। कृपया ध्यान दें कि ServiceRequest, ServiceResponse इत्यादि। - ये सिर्फ हमारी एक्सएमएल-स्कीम के आधार पर बनाई गई कक्षाएं हैं।

वसंत सेवा विन्यास

इसलिए पूरा होने वाला है।
सेवा- ws-servlet.xml फ़ाइल बनाएँ।
 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:sws="http://www.springframework.org/schema/web-services" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="org.example" /> <sws:annotation-driven /> <bean class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter"> <property name="marshaller" ref="marshaller" /> <property name="unmarshaller" ref="marshaller" /> </bean> <bean id="marshaller" class="org.springframework.oxm.xmlbeans.XmlBeansMarshaller"/> <sws:dynamic-wsdl id="HelloService" portTypeName="service" locationUri="/HelloService" > <sws:xsd location="/WEB-INF/HelloService.xsd" /> </sws:dynamic-wsdl> </beans> 

sws: एनोटेशन-चालित - यह सिर्फ कहता है कि एनोटेशन का उपयोग इस परियोजना में किया जाता है।
और संदर्भ: घटक-स्कैन उस पैकेज को इंगित करता है जिसमें एनोटेशन के लिए खोज की जाएगी, जबकि खोज को उप - पैकेज में भी किया जाता है।

अगली दो फलियाँ हमेशा अपरिवर्तित रहेंगी। उनका सार Xml से जावा ऑब्जेक्ट के लिए एक अनुरोध का रिसेप्शन और रूपांतरण है और आगे उलटा रूपांतरण है।

sws: डायनेमिक- wsdl जेनोमेड Xml स्कीम के आधार पर WSDL डॉक्यूमेंट को अपने आप जेनरेट करने के लिए जिम्मेदार है।
स्थान स्कीमा के लिए पथ को इंगित करता है।
स्थान - पता (कंटेनर के सापेक्ष) जिस पर डब्ल्यूएसडीएल योजना उपलब्ध होगी।
मेरे मामले में, WSDL निम्नलिखित पते पर उपलब्ध है:
लोकलहोस्ट / हैलोस्वेस्ट / हैलोस्वाइट्सडब्लड

परिनियोजन वर्णनकर्ता

और अंत में, आखिरी।
WEB-INF निर्देशिका में, हम web.xml फ़ाइल को संशोधित या बनाते हैं।
 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>HelloService</display-name> <description>HelloService</description> <servlet> <servlet-name>service-ws</servlet-name> <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> <init-param> <param-name>transformWsdlLocations</param-name> <param-value>true</param-value> </init-param> <servlet-mapping> <servlet-name>service-ws</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> 

मैं अब इस फाइल का वर्णन नहीं करूंगा, उनमें से ज्यादातर को पहले से ही पता होना चाहिए। सरल परियोजनाओं के लिए, इसे अनिवार्य रूप से नहीं बदला जाना चाहिए। यह केवल ध्यान देने योग्य है कि सर्वलेट (सर्वलेट-नाम) का नाम सेवा- ws -servlet.xml के लिए स्प्रिंग कॉन्फ़िगरेशन फ़ाइल के नाम से मेल खाना चाहिए।

खैर, फिर एप्लिकेशन को सर्वर पर तैनात करें।
यह सेवा के निर्माण को पूरा करता है। यदि आपको कुछ भी याद नहीं है, तो सेवा कार्य करना चाहिए।

स्वास्थ्य जाँच

सही संचालन का पहला संकेत डब्ल्यूएसडीएल योजना है।
जाँच करने के लिए, बस इस योजना के पते पर जाएँ (http: //localhost/HelloService/HelloService.wsdl) और देखें: xml फ़ाइल वहाँ प्रदर्शित होनी चाहिए। यदि कुछ भी प्रदर्शित नहीं होता है या क्या त्रुटि दिखाई दी है, तो हम पूरे लेख को ध्यान से पढ़ते हैं और देखते हैं कि हमने क्या गलत किया।

आगे सत्यापन के लिए, हमें साबुनयूआई की आवश्यकता है (मेरे पास संस्करण 3.0.1 है)।
इसे स्थापित करें और चलाएं।
एक नया प्रोजेक्ट बनाएं: फ़ाइल => नया साबुन प्रोजेक्ट। आरंभिक WSDL / WADL फ़ील्ड में, WSDL योजना (http: //localhost/HelloService/HelloService.wsdl) का लिंक डालें।
बनाई गई परियोजना में, आवश्यक अनुरोध खोलें।

नाम फ़ील्ड में हम नाम में ड्राइव करते हैं और "अनुरोध भेजें" बटन पर क्लिक करें

नतीजतन, हमें ग्रीटिंग और वर्तमान समय के साथ सर्वर से प्रतिक्रिया मिलती है।

अगर कुछ गलत हुआ, तो इस लेख को फिर से पढ़ें।

आगे क्या है?

ठीक है, तो हमें इस वेब सेवा के लिए एक क्लाइंट लिखना होगा। लेकिन यह पहले से ही एक और लेख के लिए सामग्री है, जिसे बाद में लिखा जा सकता है, अगर यह सामग्री किसी के लिए ब्याज की है।

Source: https://habr.com/ru/post/In148403/


All Articles