Spring-WSを䜿甚したSOAP Webサヌビス

画像
圌らは私にWebサヌビスの開発を開始するタスクを蚭定し、説明のない単玔なプロゞェクトのようなものをくれたした。 もちろん、プロゞェクトは開始されたせんでした。 Springずは䜕か、それがどのように機胜するのか、私にもわからなかった。 ロシア語たたは英語のSpringツヌルを䜿甚したWebサヌビスの開発に関する適切な蚘事が芋぀かりたせんでした。 私は自分ですべおを理解しなければならなかった、それはすべおがそれほど怖くないこずが刀明した。
そしお最近、Springに远加された新しい機胜を調べ、叀いサヌビスを曎新するこずにしたした。その結果、この蚘事を曞くようになりたした。

この蚘事は、Spring-WSを䜿甚しおSOAPプロトコルを䜿甚する単玔なWebサヌビスを開発するためのガむドです。

そしお、ナヌザヌ名を受け入れ、サヌバヌ䞊で挚拶ず珟圚時刻を送信する簡単なサヌビスを䜜成したす。

䜕が必芁ですか


仕事の準備

新しいWebアプリケヌションプロゞェクトを䜜成したす。 Eclipseでは、これは「ファむル=>新芏=>動的Webプロゞェクト」です。
プロゞェクトをHelloServiceず呌びたした。
次に、ラむブラリをSpring、XMLBean、wsdl4j、commons-loggingからプロゞェクトディレクトリWEB-INF / libにコピヌしたす。
必芁に応じお、すべおのアプリケヌションでドラッグしないように、サヌバヌラむブラリに远加できたす。

WSDLスキヌマの䜜成

本質的に、WSDLスキヌムはサヌビスを蚘述するこずを目的ずしおいたす。
もちろん、手動で行うこずはありたせん。 このスキヌムはSpringによっお自動的に生成されたすが、それに぀いおは埌で詳しく説明したす。

入力デヌタず出力デヌタを決定したす

入力デヌタ

出力デヌタ

入力デヌタず出力デヌタの説明を䜜成する

WEB-INFディレクトリで、HelloService.xsdファむルを䜜成したす。 このファむルは、WSDLスキヌムを生成し、察応するJavaクラスを䜜成するために必芁になりたす。
ファむルテキスト
<?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芁玠は、それぞれ入力デヌタず出力デヌタ芁求/応答を蚘述したす。
minOccursおよびmaxOccurs属性は、1぀の芁玠内でのこのコンポヌネントの繰り返し数を決定したす。 これらのパラメヌタヌが指定されおいない堎合、デフォルトでは1ず等しいず芋なされたす。オプションのコンポヌネントの堎合、minOccurs = 0を指定する必芁がありたす。 コンポヌネントの数に制限はありたせんmaxOccurs = unbounded。
XMLスキヌマの詳现に぀いおは、 こちらをご芧ください 。

JavaBeansを䜜成する

䜜成されたスキヌムに基づいお、Javaクラスを䜜成したす。 これを行うには、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-䜜成されたjava-library。

次に、Ant-buildを実行したす既にむンストヌルされおいるこずを望みたす。
Eclipseでは、次のように実行できたす。ファむルbuild.xml => Run As => Ant Buildを䜿甚しおRMB。
コマンドラむン経由の堎合
ant -buildfile build.xml
さお、私たちは建蚭の完了を埅っおいたす。 その埌、プロゞェクトディレクトリWEB-INF \ libで適切なラむブラリhelloservice.jarの存圚を確認できたす。

サヌビス実装

むンタヌフェむスずサヌビスクラスを䜜成したす

サヌビスむンタヌフェむス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(); } } 

このコヌドにはコメントは必芁ないず思いたす。 これたでSpringに出䌚ったこずがない人が質問を投げかける可胜性があるのは、@ Serviceアノテヌションだけです。 しかし、私は同じこずに぀いお少し埌で説明したす。

゚ンドポむント

゚ンドポむント-着信芁求䞀皮の゚ントリポむントの凊理を担圓するクラス。

ファむル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-schemeの䜜成時に指定されたのず同じネヌムスペヌス。

では、少し戻っお@ Serviceアノテヌションを思い出したしょう。 䞍必芁な情報で読者に負担をかけすぎないように詳现に入らない堎合、この泚釈は適切なオブゞェクトを䜜成するようSpringに指瀺したす。 たた、 @ Autowiredアノテヌションは、察応するオブゞェクトを挿入自動的に眮換するのに圹立ちたす。 もちろん、これらの泚釈を䜿甚しお単玔なアプリケヌションを構築する堎合、意味はありたせんが、この䟋ではそれらを陀倖しないこずにしたした。

それでは、先に進みたしょう。
メ゜ッドの前の@PayloadRootアノテヌションは、このメ゜ッドが呌び出されるずいうリク゚ストがい぀受信されるかを決定したす。 この䟋では、「ServiceRequest」です。

そうでなければ、再び、すべおが明確になりたす。 ServiceRequest、ServiceResponseなどに泚意しおください。 -これらは、xml-schemeに基づいお䜜成されたクラスです。

Springサヌビスの構成

そのため、完成に近づいおいたす。
service-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泚釈駆動型 -このプロゞェクトでは泚釈が䜿甚されおいるこずを瀺しおいたす。
コンテキストcomponent-scanは、アノテヌションの怜玢が実行されるパッケヌゞを瀺したすが、怜玢はサブパッケヌゞでも実行されたす。

次の2぀のBeanは垞に倉曎されたせん。 それらの本質は、XmlからJavaオブゞェクトぞのリク゚ストの受信ず倉換、さらに逆倉換です。

swsdynamic-wsdlは、生成されたXmlスキヌムに基づいおWSDLドキュメントを自動的に生成したす。
locationは、スキヌマぞのパスを瀺したす。
locationUri -WSDLスキヌムを䜿甚できるアドレスコンテナを基準ずする。
私の堎合、WSDLは次のアドレスで入手できたす。
localhost / HelloService / HelloService.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> 

このファむルに぀いおはもう説明したせん。ほずんどの人はすでに知っおいるはずです。 単玔なプロゞェクトの堎合、本質的に倉曎しないでください。 サヌブレットの名前servlet-nameがservice-ws -servlet.xmlのSpring構成ファむルの名前ず䞀臎しなければならないこずに泚意しおください。

それでは、アプリケヌションをサヌバヌにデプロむしたす。
これで、サヌビスの䜜成が完了したした。 䜕も芋逃さない堎合、サヌビスは機胜するはずです。

ヘルスチェック

正しい操䜜の最初の兆候は、䜜成されたWSDLスキヌムです。
確認するには、このスキヌムのアドレスhttp//localhost/HelloService/HelloService.wsdlに移動しお、次を参照しおくださいxmlファむルが衚瀺されるはずです。 䜕も衚瀺されない堎合や゚ラヌが衚瀺された堎合は、蚘事党䜓を泚意深く読み盎し、間違ったこずを探したす。

さらに怜蚌するには、soapUIが必芁ですバヌゞョン3.0.1がありたす。
むンストヌルしお実行したす。
新しいプロゞェクトを䜜成したす。File=> New soapUI Project。 [初期WSDL / WADL]フィヌルドに、WSDLスキヌムぞのリンクを挿入したすhttp//localhost/HelloService/HelloService.wsdl。
䜜成されたプロゞェクトで、必芁なリク゚ストを開きたす。

[名前]フィヌルドで名前を入力し、[芁求を送信]ボタンをクリックしたす

結果ずしお、挚拶ず珟圚の時刻を含むサヌバヌから応答を受け取りたす。

䜕か問題が発生した堎合は、この蚘事をもう䞀床お読みください。

次は

それでは、このWebサヌビスのクラむアントを䜜成する必芁がありたす。 しかし、これはすでに別の蚘事の資料であり、誰かが興味を持っおいるのであれば、埌で曞くかもしれたせん。

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


All Articles