問題

JAX-WS開発では、次のサービスエンドポイントが導入されると、


File:HelloWorld.java

package com.mkyong.ws;//Service Endpoint Interface
@WebService
public interface HelloWorld{

    @WebMethod String getHelloWorldAsString();
}

ファイル:HelloWorld Impl.java

 //Service Implementation
package com.mkyong.ws;
@WebService(endpointInterface = "com.mkyong.ws.HelloWorld")
public class HelloWorldImpl implements HelloWorld{

    @Override
    public String getHelloWorldAsString() {
       //...
    }

}

すぐにエラーメッセージが表示されますか?

Exception in thread "main" com.sun.xml.internal.ws.model.RuntimeModelerException:
    runtime modeler error:

        Wrapper class com.mkyong.ws.jaxws.GetHelloWorldAsString is not found.
        Have you run APT to generate them?

    at com.sun.xml.internal.ws.model.RuntimeModeler.getClass(RuntimeModeler.java:256)
   //...

解決策

サービスエンドポイントインターフェイスには `@ SOAPBinding`というアノテーションは付けられていないので、デフォルトの

ドキュメントスタイル

を使用して公開します。人間が読みやすいように、次のように書き直すことができます。

 //Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.DOCUMENT, use=Use.LITERAL)
public interface HelloWorld{

    @WebMethod String getHelloWorldAsString();
}

ドキュメントスタイルでは、 ”

wsgen

“ツールを使用して、サービスパブリケーションに必要なすべてのJAX-WSポータブルアーティファクト(マッピングクラス、wsdlまたはxsdスキーマ)を生成する必要があります。

wsgenコマンド

wsgen -keep -cp . com.mkyong.ws.HelloWorldImpl

  • package.jaxws ** フォルダの下に、単一のgetHelloWorldAsString()メソッドの2つのクラスを生成します。

    1. GetHelloWorldAsString.java

    2. GetHelloWorldAsStringResponse.java

それらのクラスを正しいフォルダにコピーします。この場合、 ”

com.mkyong.ws.jaxws

“です。もう一度公開してみてください。