0

会社の cisco 電話に少し機能を追加する、いくつかの安らかな Web サービスを作成しようとしています。基本的な考え方は単純です。ユーザーは、ログインとパスワードを入力する必要がある小さなクライアントを取得します。彼らがそうすると、彼らの電話は私の安らかなサービスに「登録」され、彼らの電話に追加機能が追加されます。ログアウトすると、登録が解除されます。追加機能(調整された発信者情報など)を提供するには、Cisco AXL API が必要です。これは SOAP ベースの API です。すでに wsdl を使用して Java クラスを生成しています。生成されたクラスを使用してテストクライアントを作成すると、すべて正常に動作します。

しかし、ここで問題が発生します。アプリケーションが Tomcat 7 コンテナーにデプロイされているときに SOAP 要求を実行しようとすると、機能しなくなります。

問題は、次のコードを実行するとハングする AXLAPIService にあるようです。

@WebEndpoint(name = "AXLPort")
public AXLPort getAXLPort() {
    return super.getPort(new QName("http://www.cisco.com/AXLAPIService/", "AXLPort"), AXLPort.class);
}

つまり、soap リクエスト用のポートを取得できず、十分に待機すると tomcat がクラッシュします。

私はグーグルに行きました。古いstaxバージョンが原因で、あるフォーラムの誰かがかつて問題を抱えていました。POM で Stax のバージョンを調整して再試行しましたが、役に立ちませんでした。

また、基になる javax.xml.ws.Service には実際にポートの列挙があり、getPort() を実行すると、最も適切なポートが取得されることもどこかで読みました。次に、SOAP のデフォルト ポートを調べたところ、RESTful サービスに使用されるポートと同じように 80 でした。SOAP サービスがポート 80 を必要としているのに、既に使用されているためにそれを使用できないということでしょうか?

だから、私の質問を要約すると:

  • 私の安らかなサービスが、私の石鹸リクエストが使用したいのと同じポートを消費している可能性はありますか?
  • そうでない場合、何が問題なのか、どうすれば修正できますか?

追加情報として、これは axl wsdl がサービスを定義する方法です。

<service name="AXLAPIService">
<port binding="s0:AXLAPIBinding" name="AXLPort">
  <soap:address location="https://CCMSERVERNAME:8443/axl/"/>
</port>

ソープポートを自分で交換しようと考えていました。いくつかのグーグルは、wsdlでそれを行うべきだと言っていますが、その方法は本当にわかりません。すでにここに投稿がありますが、別のポート名をバインドするとどのように役立つかわかりません....

4

1 に答える 1

0

Cisco Telephony とその管理 XmL (AXL) に関連する非常に多くのことと同様に、実際の回答ではなく回避策を見つけました。問題が頭から離れることはないので、昨日の残りの時間は、AXL から情報を取得するための解決策を探すことに費やしました。

ただし、上記の質問に対する実際の回答は大歓迎です。

私が見つけた回避策はのとおりです。SOAP は特別な http POST 要求と見なすことができるため、Jersey などの REST フレームワークを使用して SOAP 呼び出しを実行できるはずです。それを機能させるには、追加のコードが必要です。リンクから「SoapProvider」を使用しました。これにも取り組んでいる人のために、コードを追加します。

public void doSoapRequest() throws SOAPException, JAXBException{


    ClientConfig config = new DefaultClientConfig();
    config.getClasses().add(SoapProvider.class);
    Client c = Client.create(config);
    c.addFilter(new LoggingFilter());
    c.addFilter(new HTTPBasicAuthFilter("user", "password"));

    MessageFactory messageFactory = MessageFactory.newInstance();
    SOAPMessage message = messageFactory.createMessage();
    SOAPPart soapPart = message.getSOAPPart();
    SOAPEnvelope envelope = soapPart.getEnvelope();
    SOAPBody body = envelope.getBody();
    SOAPElement bodyElement = body.addChildElement(envelope.createName("getCCMVersion", "", "http://www.cisco.com/AXL/API/8.5"));
    message.saveChanges();

    WebResource service = c.resource("https://youraxlmachine:8443/axl/");


    // POST the request
    ClientResponse cr = service.type(MediaType.TEXT_XML).header("SOAPAction", "\"https://youraxlmachine:8443/axl/getCCMVersion\"").post(ClientResponse.class, message);
    message = cr.getEntity(SOAPMessage.class);



    JAXBContext ctx = JAXBContext.newInstance(GetCCMVersionRes.class);
    Unmarshaller um = ctx.createUnmarshaller();
    GetCCMVersionRes response = (um.unmarshal(message.getSOAPPart().getEnvelope().getBody().extractContentAsDocument(), GetCCMVersionRes.class)).getValue();
    System.out.println("HERE COMES THE VERSION!");
    System.out.println(response.getReturn().getComponentVersion().getVersion());
}

会社固有の詳細を除いて、できる限り多くのことを変更していません。このコードは、CCM バージョンを取得するために機能します。

警告: リクエストの実行方法によっては、同じリクエストに対して異なる結果が得られる場合があります。説明します:

getUser など、他の AXL メソッドも実装しました。Jersey SOAP サービスをコーディングする前に、SOAPUI であらゆることを試しました。そこで、SOAPUI をセットアップして、AXL サーバーに対して RESTful 要求を実行できるようにしました。SOAPUI で安らかなセットアップを使用すると、SOAPUI と Java での SOAPClient の最初の実装の両方を使用して標準の SOAP 呼び出しを行った場合と同じ結果が得られます。

しかし、jersey クライアントを使用して同じ getUser 要求を実行すると、いくつかの重要なフィールドが結果から欠落しています。何がこれを引き起こしたのか、私にはわかりません。要求 getPhone については、有効な応答さえ得られません。ですから、注意してください。

于 2013-08-06T12:04:47.750 に答える