3

CXF から最も単純な Web サービスの例をコピーしています。インターフェイスを作成し、次に実装ファイルを作成して、Web サービス コンシューマによって提供された名前に挨拶します。パッケージ名とメソッド名を変更したのは、どこに何が表示されるかを確認したかったからです。すべてに HelloWorld という名前を付けると、メソッド、パッケージ、クラスなどの内容がわかりません。

これらの手順には、Web サービスを公開するためのプログラムが含まれています。それをした後、URLを入れます

http://localhost:9000/helloWorld?wsdl 

ブラウザーに wsdl ファイルが表示されます。このファイルには、自分のコードから生成されたものであると納得させるために、私が綴った方法で十分なものが含まれています。これに基づいて、WSDL の生成と公開の両方が機能したと思います。

これはサービス インターフェイスです。

    package hw;

    import javax.jws.WebParam;
    import javax.jws.WebService;

    @WebService
    public interface HelloWorld
    {
        String sayHi(@WebParam(name="firstName") String firstName);
    }

これはサービスの実装です:

package hwimpl;

import javax.jws.WebService;

@WebService(endpointInterface = "hw.HelloWorld", serviceName = "HelloWorld")
public class HelloWorldImpl
{
    static public void say(String msg) { System.out.println(msg); }

    public String sayHi(String firstName) 
    { say ("sayHi called with " + firstName); 
      return "Hello " + firstName + " from the World."; 
    }
}

そして、これは出版プログラムです:

package hwimpl;

import javax.xml.ws.Endpoint;

public class PublishHelloWorldService
{

    protected PublishHelloWorldService() throws Exception
    {
        // START SNIPPET: publish
        System.out.println("Starting Server");
        HelloWorldImpl implementor = new HelloWorldImpl();
        String address = "http://localhost:9000/helloWorld";
        Endpoint.publish(address, implementor);
        // END SNIPPET: publish
    }

    public static void main(String args[]) throws Exception
    {
        new PublishHelloWorldService();
        System.out.println("Server ready...");

        Thread.sleep(5 * 60 * 1000);
        System.out.println("Server exiting");
        System.exit(0);
    }
}

次に、このプログラムをコンパイルして実行します。

package client;

import hw.HelloWorld;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;


public final class HelloWorldClient
{

    private static final QName SERVICE_NAME = new QName("http://server.hw.demo/",   "HelloWorld");
    private static final QName PORT_NAME = new QName("http://server.hw.demo/",    "HelloWorldPort");

    private HelloWorldClient()
    {
    }

    public static void main(String args[]) throws Exception
    {
        Service service = Service.create(SERVICE_NAME);
        String endpointAddress = "http://localhost:9000/helloWorld";
        // If web service deployed on Tomcat deployment, endpoint should be changed
        // to:
        // String 
//      endpointAddress =
//       "http://localhost:8080/java_first_jaxws/services/hello_world";

        // Add a port to the Service
        service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);

        HelloWorld hw = service.getPort(HelloWorld.class);
        System.out.println(hw.sayHi("Albert"));

    }

}

そして、私はこのエラーを受け取ります:

Exception in thread "main" javax.xml.ws.WebServiceException: Could not send Message.
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
    at com.sun.proxy.$Proxy20.sayHi(Unknown Source)
    at client.HelloWorldClient.main(HelloWorldClient.java:37)
Caused by: java.net.MalformedURLException: Invalid address. Endpoint address cannot be null.
    at org.apache.cxf.transport.http.HTTPConduit.getURL(HTTPConduit.java:872)
    at org.apache.cxf.transport.http.HTTPConduit.getURL(HTTPConduit.java:854)
    at org.apache.cxf.transport.http.HTTPConduit.setupURL(HTTPConduit.java:800)
    at org.apache.cxf.transport.http.HTTPConduit.prepare(HTTPConduit.java:548)
    at org.apache.cxf.interceptor.MessageSenderInterceptor.handleMessage(MessageSenderInterceptor.java:46)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:516)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
    ... 2 more

eclipse からプログラム (パブリッシュとクライアントの両方) を実行しています。日食は、ウィンドウ/設定で http および https のプロキシを使用して設定されます。クライアントを実行する前に http 用のものを削除しましたが、メッセージは変更されませんでした。

これは実際には tomcat サーバーです。パブリッシュ プログラムで代替 URL を試しましたが、変更はありませんでした。

この場合、Eclipse 内から Tomcat を実行しません。自分のマシンでそれを単独で実行し、(Eclipse から) パブリッシュ プログラムを実行し、wsdl を表示する URL が正しく機能することを確認してから、(Eclipse から) クライアント プログラムを実行してエラーを取得します。

誰かが私が間違っていることを教えてもらえますか? この正確なエラーメッセージに関する他の投稿を見たことがありますが、決定的な回答はなく、すべて試したようです.

4

1 に答える 1

0

これがあなたの問題かどうかわかりません。

あなたの例で説明しているように、実行中のTomcatでTomcatアプリケーションを実行できないEclipseの問題が時々ありました。tomcat と eclipse で作業するときに私が時々しなければならないことは、

  1. 実行中のTomcat(Windowsサービス)を用意してから、EclipseアプリケーションをそのTomcatにエクスポートします
  2. Windowsサービスからそのポートで実行中のTomcatを停止し、プログラムの実行時にEclipse内からTomcatを開始します。

何らかの理由で、Eclipse は既に実行中の tomcat に問題があるようです。

于 2014-12-04T16:10:27.803 に答える