0

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 は簡単なはずだったのですか? 正しい方向への助けは大歓迎です...

4

1 に答える 1

0

解決済み: Wireshark を使用して HTTP パケットをキャプチャし、何も受信していないことに気付きました。localhost はネットワーク プロキシを経由していました。プロキシ設定が修正され、すべてが期待どおりに機能します!!!

于 2013-05-28T11:31:57.547 に答える