Glassfish で生成された WSDL サービス エンドポイント アドレスをオーバーライドする
-
22-09-2019 - |
質問
Maven を介して wsgen によって生成された Web サービスがあります。サービスを Glassfish にデプロイすると、サーバー URL が WSDL に配置されます。Glassfish サーバーの前面には Apache プロキシ サーバーがあります。
これが意味するのは、誰かが WSDL にアクセスしてサービス エンドポイントと SOAP アドレスの場所を確認すると、次のようになります。
http://app server url/service...
の代わりに
http://proxy server url/service...
いくつかの項目について説明が必要だと思います...
このエンドポイント アドレスは重要ですか?エンドポイント アドレスが、サービスを呼び出すために呼び出すプロキシ サーバーの URL と一致しない場合でも、クライアントは機能できますか。これは基本的に質問をします。」インターフェイスはオブジェクトに対するものであるため、Web サービスに対する WSDL は".
アップデート: この最初の質問に対する答えとしては、「オブジェクトへのインターフェースとしての Web サービスへの WSDL」。WSDL で指定されたエンドポイント アドレスは重要ではありません。実際、WSDL で指定されたエンドポイントとは異なるエンドポイントで Web サービス操作を呼び出すことは比較的簡単です。 ここで説明されているように.
// Create service and proxy from the generated Service class. HelloService service = new HelloService(); HelloPort proxy = service.getHelloPort();
// Override the endpoint address ((BindingProvider)proxy).getRequestContext().put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://new/エンドポイントアドレス"); proxy.sayHello("Hello World!");
WSDL は、Glassfish にデプロイするときに自動的に生成されます。アプリサーバー設定を通じて、Glassfish で生成されたこのエンドポイント アドレスをオーバーライドする簡単な方法はありますか。その場合は、生成された WSDL にプロキシ サーバーの URL を自動的に配置する設定を作成できます。
1 が実際に重要であり、2 でそれをオーバーライドできない場合、基本的には開発と運用で別々のビルドを実行する必要があることを意味します。これは「正しいとは思えません」。別のサーバーにデプロイするために必要なのは、既存の (そしてテスト済みの) war を 1 つの環境から新しいサーバーにドロップすることだけだと思われるからです。
解決
があることが判明しました Server Name
のパラメータ HTTP Listener
サービスが展開される場所。この値は Glassfish 管理コンソールから指定でき、Glassfish はリクエスト URL 内のホスト名ではなくこの名前を使用します。
残念ながら、アプリサーバーとプロキシサーバーが同じものを使用していない場合(私たちのものは使用していません)、このパラメータではポートまたはプロトコルをオーバーライドすることはできません(http から https に)。
代わりに私がしたのは、 単純なサーブレットフィルターを作成する 私のサービスが私に代わってこれを処理します。
他のヒント
私は、問題に対処するための非常に単純な方法であると考えるものを発見しました。この問題で、私たちのものはすでにアパッチを使用している、そしてそれはで、シンプルな組み込まれているので、私は最高のこのアプローチを言っています。
私はApacheのconfのファイルのいずれかに以下と同様のブロックを置くと喜び見つけます:
<Location />
AddOutputFilterByType SUBSTITUTE text/xml
Substitute "s|http://internal:8080/xxx|https://external/xxx|ni"
</Location>