ああ、私は最近、xsd に基づいて spring-ws を介して Web サービスを公開する方法を見つけるために、同じ探求の多くを経験しました。Spring WS 2 Made Easyを見つけたこのブログをチェックすることを強くお勧めします
私が調べた 20 以上のうち、最も役立つものの 1 つであり、完全なソースを簡単にダウンロードできます。
xsd (または wsdl) のみに基づいて Web サービスを公開できます。
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!-- To detect @Endpoint -->
<sws:annotation-driven />
<!-- publish wsdl from xsd (use during development)-->
<sws:dynamic-wsdl
id="processStuff"
portTypeName="MyService"
locationUri="/myService"
requestSuffix="Request"
responseSuffix="Response"
targetNamespace="http://mycompany.com/dostuff">
<sws:xsd location="/WEB-INF/xsds/myschema.xsd"/>
</sws:dynamic-wsdl>
<!-- publish static wsdl (better for production deployments)-->
<sws:static-wsdl id="orders" location="/WEB-INF/wsdl/orders.wsdl"/>
</beans>
Spring WS は ID の場所で wsdl を公開します。xsd の例では、これは http://localhost:8080/[warName]/processStuff.wsdl で公開されます。
リクエストとレスポンスのサフィックスに一致する xsd のアイテムは、公開時に wsdl 操作として解釈されます。
次に、xsd からの操作と引数に一致する @Endpoint で注釈が付けられたクラスを開発する必要があります。
小さな例:
@Endpoint
public class MyWebService {
@PayloadRoot(namespace = "http://mycompany.com/dostuff", localPart = "SomeRequest")
@ResponsePayload
public SomeResponse getSomething(@RequestPayload SomeRequest something) {
return new SomeResponse();
}
}
私はそれが最初に契約だと言います.コードを介して契約を書いただけです. 個人的には xsd よりも Java コードを書きたいと思っています。
Sean F が指摘したように、動的 wsdl 生成は、Spring のページに記載されているように、開発中にのみ行う必要があります。
注意
実行時に XSD から WSDL を作成するのは非常に便利ですが、この方法にはいくつかの欠点があります。まず、リリース間で WSDL 生成プロセスの一貫性を保つように努めていますが、それでも (わずかに) 変更される可能性があります。第 2 に、生成が少し遅くなりますが、生成された WSDL は後で参照できるようにキャッシュされます。したがって、プロジェクトの開発段階でのみ使用することをお勧めします。次に、ブラウザーを使用して、生成された WSDL をダウンロードし、プロジェクトに保存して、.xml で公開することをお勧めします。これは、WSDL が時間の経過とともに変化しないことを本当に確実にする唯一の方法です。