3

コンテキスト:アプリケーション サーバーは Glassfish 3.1.2 です。テクノロジーは JavaEE JAX-WS です。IDE は Netbeans 7.1.1 です。

wsimport を使用して、WSDL から始まる 2 つの Web サービスを作成しました。EJB もそうではありません。どちらも@WebServiceアノテーションを使用します。両方とも同じWARに住んでいます(関連するかどうかはわかりませんが、関連する可能性があります)。SOAP-UI をクライアントとして使用して、両方のサービスを個別にデプロイしてテストできます。

実行時に WebService1 を呼び出して WebService2 を取得したいと考えています。Java を使用して webservice2 の impl を呼び出したいだけではありません (いわばローカルで)。より疎結合を作成するために、webservice2 を Web サービスとして適切に呼び出したいと思います。

IDE では、提供されている「コードの生成: Web サービス呼び出し操作」機能を使用して、Web サービス呼び出しに必要なコードを生成できます。これにより、@WebServiceRef (wsdlLocation = "WEB-INF/wsdl/servicename.wsdl") と、ポートを作成してターゲット Web サービス操作を呼び出すコードが追加されまし

    // Call Web Service Operation
   Identity port = service.getIdentityPort();
   String req = "";
   javax.xml.ws.Holder<StructureMessageHeader> idHeader = new javax.xml.ws.Holder<StructureMessageHeader>();
   String result = port.getIdentifier(req, idHeader);

これは正常にコンパイルされますが、実行時に失敗します。展開は成功し、サービスは両方とも稼働しており、(このコードを呼び出さない限り) 個別に満足していますが、1 つの Web サービスが別の Web サービスを呼び出そうとすると、

ClientTransportException: The server sent HTTP status code 404: Not Found.

詳細は以下をご覧ください。

なぜこれが起こるのか誰にも分かりますか?どこで私は間違えましたか?私は何を見落としましたか?

どんな助けでも大歓迎です。

- - - - - - - - - - - - 例外 - - - - - - - - - - -

com.sun.xml.ws.client.ClientTransportException: The server sent HTTP status code 404: Not Found at com.sun.xml.ws.transport.http.client.HttpTransportPipe.checkStatusCode(HttpTransportPipe.java:321) at com.sun.xml.ws.transport.http.client.HttpTransportPipe.createResponsePacket(HttpTransportPipe.java:270) at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:228) at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:143) at com.sun.xml.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:110) at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:961) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775) at com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:116) at com.sun.enterprise.security.webservices.ClientSecurityPipe.processSecureRequest(ClientSecurityPipe.java:196) at com.sun.enterprise.security.webservices.ClientSecurityPipe.process(ClientSecurityPipe.java:184) at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:119) at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:961) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775) at com.sun.xml.ws.client.Stub.process(Stub.java:429) at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:168) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:102) at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:151) at $Proxy219.getIdentifier(Unknown Source) at com.soagrowers.r20121231.product.master.services.ProductsEntityService.createProduct(ProductsEntityService.java:138) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.glassfish.webservices.InstanceResolverImpl$1.invoke(InstanceResolverImpl.java:143) at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:149) at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:94) at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:961) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775) at com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:116) at org.glassfish.webservices.MonitoringPipe.process(MonitoringPipe.java:142) at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:119) at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:961) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775) at com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:116) at com.sun.enterprise.security.webservices.CommonServerSecurityPipe.processRequest(CommonServerSecurityPipe.java:212) at com.sun.enterprise.security.webservices.CommonServerSecurityPipe.process(CommonServerSecurityPipe.java:144) at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:119) at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:961) at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910) at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873) at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775) at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:386) at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:640) at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:263) at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:163) at org.glassfish.webservices.JAXWSServlet.doPost(JAXWSServlet.java:145) at javax.servlet.http.HttpServlet.service(HttpServlet.java:688) at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:662)

4

3 に答える 3

2

私はそれを修正したと思います

2 つの問題がありましたが、これらのエラーを修正した後、私のコードは正常に動作するようになりました。

問題#1。(マイナー) jax-ws-catalog.xml に、WebService2 の WSDL または XSD ファイルへの参照が含まれていませんでした。これは、JAX-WS フレームワークが、HTTP 経由で WSDL または XSD をロードする必要なく、実行時に WSDL のローカル コピーを利用できるようにするために必要です。

問題#2。(メジャー) jax-ws-catalog で参照されている WSDL の「サービス」セクションには、その中に正確なエンドポイントの場所が必要です。ランタイム サーバーは、さまざまな構成 (たとえば、@webservice アノテーションの詳細など) に従って、このビットの WSDL をサービスの正しい http エンドポイントの場所に書き換えます。もちろん、「WSDL から開始」する場合、このエンドポイントは完全に架空のものになる可能性があります。これは、サービス コントラクトが実装から切り離されているためです (私の場合のように)。したがって、JAX-WS が jax-ws-catalog で指定された場所から WSDL を取得すると、存在せず解決できない http の場所が見つかります。したがって、" ClientTransportException: The server sent HTTP status code 404: Not Found." - WSDL の URL に問題がありました。

概要。 解決策は、Web サービスの正確なエンドポイントの場所を WSDL の「サービス」定義セクションに追加し、WSDL とその XSD が jax-ws-catalog に正しくリストされていることを確認することでした。

于 2012-05-25T09:53:24.720 に答える
1

最初のWebサービスにWebクライアントを埋め込む必要があります。最初のWebサービスは、2番目のWebサービスからの情報を要求します。 apacheのこのクライアントは、良好な結果で使用されています。

場合によっては、Webサービスライブラリに、テストを容易にするための埋め込みWebクライアントが含まれていることもあります。ライブラリにそのようなクライアントが含まれている場合は、Webクライアントの実装を追加する必要もありません。

---JAXWSAPIが「クライアント」サポートを提供するかどうかについての質問に回答するために編集されました---

確かに、JAX-WSにはWebサービスをセットアップするためのすべてがありますが、Webサービスを呼び出すためのすべてが含まれているという仕様の一部であるかどうかはわかりません。私はそのような機能を欠いている実装を見たことがないので、「たまに」ライブラリにクライアントが含まれていると応答することは、それが欠落している可能性について少し誇張されていました。

いずれにせよ、クライアントをサポートするクラスは、XMLジェネレーターとHTTPクライアントをラップするだけです。

メモリが正しく機能する場合は、WSDLのコピーを取得します。このコピーは、指定されたパッケージ名前空間でJavaソースコードを出力する「コンパイラ」によって読み取られます。次に、生成されたクラスを使用して、リモートWebサービスへのAPIレベルのアクセス権があります。最終結果は次のようになります

public static void main(String[] args) {
    /* Create the service instance */
    CalculatorService service = new CalculatorService();
    CalculatorDelegate delegate = service.getCalculatorPort();

    /* Using the web service, perform the 4 calculations */
    System.out.println("1. 3+7=" + delegate.add(3, 7));
    System.out.println("2. 12-2=" + delegate.subtract(12, 2));
    System.out.println("3. 9*9=" + delegate.multiply(9, 9));
    System.out.println("4. 40/2=" + delegate.divide(40, 2));
} 

ここで、XXXServiceオブジェクトを作成して「サービスのクライアント側ビュー」を作成し、それにアタッチして、タイプXXXDelegateのデリゲートオブジェクトを生成します。デリゲートのメソッドは、実際に新しいオブジェクトを生成し(「SomeCall.java」をバインドするポートごとに1つのオブジェクトが存在します)、リクエストをカプセル化します。応答は「SomeCallReply.java」ファイルによって処理され、デリゲートはこれを使用して解凍します。応答し、値を「クライアント」コードに返します。

例は、このチュートリアルの下部にあります。繰り返しになりますが、これは高レベルのものについての私の理解です。詳細はJAXWSの新しいリリースで変更されている可能性があります。私が深く掘ったとき、それはゲームのかなり早い段階でした。それ以来、JAXWSのリリースはたくさんあります。

于 2012-05-24T15:04:01.430 に答える
1

これにアプローチするためのより良い方法は、Webサービスをレイヤーにしてからアプリケーションロジックを呼び出すことです。次に、ビジネスロジックの一方のセットがもう一方のセットを呼び出す必要がある場合、不要なhttpラウンドトリップを実行する必要はありません。@Serviceや@AutowiredでSpringのようなものを使用することを検討してください。EJBの世界では(これは使用していないとおっしゃっていますが)、これは@Localインターフェイスと@EJBセッションインジェクションを使用して行われるため、別のクラスのメソッドを呼び出すためだけに巨大なリモートAPIスタックを経由することはありません。

于 2012-05-24T18:55:29.420 に答える