2016-05-09 15 views
0

外部システムとの統合中に、ある環境から別の環境に切り替える必要がありました。これは、wsdlが置かれているURLを変更し、ヘッダーにユーザーの資格情報を入れることを意味します。かなり簡単に見えますが、私は奇妙な行動に気付きました。SOAPActionヘッダーがサービスと一致しません

ID: 496 
Address: https://domain/env/port 
Encoding: UTF-8 
Http-Method: POST 
Content-Type: text/xml 
Headers: {Accept=[*/*], password=[test], SOAPAction=["serviceB"], UserName=[test]} 
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><a:aRequest xmlns:a="http://a/namespace/">... 

その後、応答は次のとおりです。私はポート1上にあるサービスAをコールしようとすると、ポート1にもあるSOAPActionヘッダーがサービスBの値に置き換えられ、何らかの理由でそれは何かのように見えますもちろん、予期しない要求オブジェクトが渡されています。 SOAPActionヘッダーがOKであることが時々あるということは奇妙なことですが、呼び出されたサービスはOKであり、要求オブジェクトはOKですが、何らかの理由で別のサービスを呼び出すためにコール。

私の質問は:SAOPActionの値がどのように設定されているのですか - 生成されたクラスから@WebMethod(action = "serviceA")か、それともwsdlファイルの読み込み中に生成されていますか?問題が私側にあるのか、外部のサーバー側にあるのかを把握する必要があります。

EDIT: 私が気付いたのは、初めてserviceAを呼び出すと、SOAPActionヘッダーがoperationBに設定されていることです。次に、serviceAとレスポンスコードが2回目になると、最初にserviceBを呼び出し、SOAPActionヘッダーがserviceAに設定されています。私はserviceBを呼び出すと二度目はその後、応答コードが200で、キャッシングのいくつかの種類があるようなので、それが見えます...

EDIT(?!): オクラホマので、それはそれのようになります。私は、ポートを作成していますjavax.xml.wsパッケージのServiceクラスはService myservice = Service.create(serviceName)メソッド、myservice.getPort(MySpecifiedPort.class)です。私は@Producesとこのメソッドを注釈し、私はこのポートが必要な場合は、@Inject注釈を注入する。時々私はプールからインスタンスを受け取る(私は考える)。そしてそれが起こるならば、SOAPActionは以前の呼び出しからの値に設定されます。しかし、なぜこれは起こるのでしょうか? WSAを呼び出すたびにSOAPActionを新しいものとして設定するべきではありませんか? Whisは何とかキャッシュされるように見えますか?

答えて

0

最後に、私は解決策を見つけたと思います。これが問題の原因となり、SOAPActionヘッダーは時々前の呼び出しから覚えてきたいくつかの理由について

Map<String, List<String>> headers = (Map<String, List<String>>) bp.getRequestContext().get(MessageContext.HTTP_REQUEST_HEADERS); 
if (headers == null) { 
    headers = new HashMap<>(); 
} 
headers.put("UserName", Collections.singletonList(configuration.getProperty(API_USERNAME))); 
headers.put("password", Collections.singletonList(configuration.getProperty(API_PASSWORD))); 
bp.getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, headers); 

:問題は、私がやった資格情報を使用してHTTPヘッダーを設定するためにということでした。

bp.getBinding().setHandlerChain(Collections.<Handler>singletonList(new CredentialsHandler(configuration))); 
:ソリューションはSOAPHandler

class CredentialsHandler implements SOAPHandler<SOAPMessageContext> { 

    private Configuration configuration; 

    public CredentialsHandler(Configuration configuration) { 
     this.configuration = configuration; 
    } 

    @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     try { 
      Map<String, List<String>> headers = new HashMap<>(); 
      headers.put("UserName", Collections.singletonList(configuration.getProperty(API_USERNAME))); 
      headers.put("password", Collections.singletonList(configuration.getProperty(API_PASSWORD))); 
      context.put(MessageContext.HTTP_REQUEST_HEADERS, headers); 
     } catch (ConfigurationException e) { 
      throw new IllegalStateException("Configuration exception"); 
     } 

     return true; 
    } 
} 

そして、私のヘッダは、次のコード行を入れて追加された場所でを実装することです

関連する問題