Tomcat 7 と Metro 2.2 で実行する単純な HelloWorldWS プロジェクトを作成しました。ローカルの tomcat サーバーに、ant スクリプトを使用してメトロ ライブラリをインストールしました。また、JDK 内の JDK + JRE で作成した承認済みフォルダーにライブラリを追加しました。JDK(1.7.0 64ビット)
以下は、Web サービス クラスのスニペットです。
package za.co.atheba.ws;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService
@SOAPBinding(style = Style.RPC)
public class Customer {
@WebMethod
public String hello(final String name){
return "Hello " +name;
}
}
web.xml に ws サーブレットを追加しました。
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
<description>JAX-WS endpoint</description>
<display-name>WSServlet</display-name>
<servlet-name>WSServlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WSServlet</servlet-name>
<!--
The url-pattern gets appended to the application's root context which is the name of the .war.
If the war is packaged in HugeWebServices.war and the url-pattern is set to <url-pattern>/webservices/*</url-pattern>,
then the servlet context/url will be host:port/HugeWebServices/webservices.
-->
<url-pattern>/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
そして、これを sun-jaxws.xml に接続します。
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
<endpoint
name="CustomerService"
implementation="za.co.atheba.ws.Customer"
wsdl="WEB-INF/wsdl/CustomerService.wsdl"
url-pattern="/CustomerService"/>
</endpoints>
.war としてパッケージ化し、Tomcat に正常にデプロイします。wsdlを正しく表示できます...
Eclipse Web サービス エクスプローラーを使用して Web サービスに対してテストしようとしましたが、操作で「IWAB0135E 予期しないエラーが発生しました。java.net.SocketException ソフトウェアにより接続が中止されました: recv が失敗しました」が返されます。
次に、wsdl で wsimport を呼び出してクライアント アーティファクトを生成しようとしましたが、次のエラーが発生しました。
[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s):
At least one WSDL with at least one service definition needs to be provided.
Exception in thread "main" javax.xml.stream.FactoryConfigurationError: Provider
com.ctc.wstx.stax.WstxInputFactory not found
at javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:72)
at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:163)
at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:92)
at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:136
)
at com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory.getXMLIn
putFactory(XMLStreamReaderFactory.java:98)
at com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory.<clinit>
(XMLStreamReaderFactory.java:67)
at com.sun.xml.internal.ws.api.addressing.WSEndpointReference.<init>(WSE
ndpointReference.java:157)
at com.sun.xml.internal.ws.api.addressing.AddressingVersion.<init>(Addre
ssingVersion.java:426)
at com.sun.xml.internal.ws.api.addressing.AddressingVersion.<init>(Addre
ssingVersion.java:57)
at com.sun.xml.internal.ws.api.addressing.AddressingVersion$1.<init>(Add
ressingVersion.java:59)
at com.sun.xml.internal.ws.api.addressing.AddressingVersion.<clinit>(Add
ressingVersion.java:59)
at com.sun.tools.internal.ws.wsdl.parser.MemberSubmissionAddressingExten
sionHandler.getNamespaceURI(MemberSubmissionAddressingExtensionHandler.java:51)
at com.sun.tools.internal.ws.wsdl.parser.WSDLParser.register(WSDLParser.
java:130)
at com.sun.tools.internal.ws.wsdl.parser.WSDLParser.<init>(WSDLParser.ja
va:114)
at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.buildMod
el(WSDLModeler.java:99)
at com.sun.tools.internal.ws.wscompile.WsimportTool.run(WsimportTool.jav
a:178)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.sun.tools.internal.ws.Invoker.invoke(Invoker.java:120)
at com.sun.tools.internal.ws.WsImport.main(WsImport.java:42)
私は 2 つのアプローチを試しました。
これがwsdlです:
<!--
Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.2.1-1 (tags/2.2.1-1-7267; 2012-08-30T14:04:51+0000) JAXWS-RI/2.2.7 JAXWS/2.2 svn-revision#unknown.
-->
<!-- WSgen created wsdl -->
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:tns="http://ws.atheba.co.za/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" targetNamespace="http://ws.atheba.co.za/" name="CustomerService">
<types>
<xsd:schema>
<xsd:import namespace="http://ws.atheba.co.za/" schemaLocation="http://localhost:8080/HelloWorldWS/CustomerService?xsd=1"/>
</xsd:schema>
</types>
<message name="hello">
<part name="parameters" element="tns:hello"/>
</message>
<message name="helloResponse">
<part name="parameters" element="tns:helloResponse"/>
</message>
<portType name="Customer">
<operation name="hello">
<input wsam:Action="http://ws.atheba.co.za/Customer/helloRequest" message="tns:hello"/>
<output wsam:Action="http://ws.atheba.co.za/Customer/helloResponse" message="tns:helloResponse"/>
</operation>
</portType>
<binding name="CustomerPortBinding" type="tns:Customer">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="hello">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="CustomerService">
<port name="CustomerPort" binding="tns:CustomerPortBinding">
<soap:address location="http://localhost:8080/HelloWorldWS/CustomerService"/>
</port>
</service>
</definitions>
どちらの場合も、サービスは正しくデプロイされますが、wsdl に対してクライアントを作成しようとすると失敗します。Jax-ws は簡単なはずだったのですか? 正しい方向への助けは大歓迎です...