36

いくつかのWebサービスを利用するためのスタンドアロンクライアントを作成しようとしています。ユーザー名とパスワードをSOAPヘッダーに追加する必要があります。次のようにクレデンシャルを追加してみました。

OTSWebSvcsService service = new OTSWebSvcsService();
OTSWebSvcs port = service.getOTSWebSvcs();

BindingProvider prov = (BindingProvider)port;
prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "myusername");
prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "mypassword");

...

サービスのメソッドを呼び出すと、次の例外が発生します。

com.ibm.wsspi.wssecurity.SoapSecurityException: WSEC5048E: One of "SOAP Header" elements required.

私は何が間違っているのですか?これらのプロパティをSOAPヘッダーに追加するにはどうすればよいですか?

編集:JDK6に含まれているJAX-WS2.1を使用していました。現在、JAX-WS2.2を使用しています。次の例外が発生します。

com.ibm.wsspi.wssecurity.SoapSecurityException: WSEC5509E: A security token whose type is [http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken] is required.

このトークンを作成するにはどうすればよいですか?

4

10 に答える 10

41

@WebParam(header = true) を使用して、SOAP ヘッダー (JaxWS) でデータを転送できます。

@WebMethod(operationName = "SendRequest", action = "http://abcd.ru/")
@Oneway
public void sendRequest(
    @WebParam(name = "Message", targetNamespace = "http://abcd.ru/", partName = "Message")
    Data message,
    @WebParam(name = "ServiceHeader", targetNamespace = "http://abcd.ru/", header = true, partName = "ServiceHeader")
    Header serviceHeader);

SOAP ヘッダーを使用してクライアントを生成する場合は、-XadditionalHeaders を使用する必要があります。

wsimport -keep -Xnocompile -XadditionalHeaders -Xdebug http://12.34.56.78:8080/TestHeaders/somewsdl?wsdl -d /home/evgeny/DEVELOPMENT/JAVA/gen

@Oneway Web サービスが必要ない場合は、Holder を使用できます。

@WebMethod(operationName = "SendRequest", action = "http://abcd.ru/")
public void sendRequest(
    @WebParam(name = "Message", targetNamespace = "http://abcd.ru/", partName = "Message")
    Data message,
    @WebParam(name = "ServiceHeader", targetNamespace = "http://abcd.ru/", header = true, partName = "ServiceHeader")
    Holder<Header> serviceHeader);
于 2012-12-09T09:14:11.907 に答える
34

質問にいくつかの詳細が欠けているため、100% 確実ではありませんが、JAX-WS RI を使用している場合は、リクエスト送信時に SOAP ヘッダーを追加するをご覧ください。

これを行う移植可能な方法は、SAAJ を作成しSOAPHandlerて混乱させることですが、RI はこれを行うためのより良い方法を提供します。

プロキシまたはディスパッチ オブジェクトを作成すると、それらは BindingProviderインターフェイスを実装します。WSBindingProviderJAX-WS RI を使用すると、JAX-WS RIだけが提供するいくつかのメソッドをさらに定義する にダウンキャストでき ます。

このインターフェイスを使用すると、それぞれが SOAP ヘッダーを表す、任意の数の Header オブジェクトを設定できます。必要に応じて独自に実装することもできますが、ほとんどの場合、 Headersクラスで定義されたファクトリ メソッドの 1 つを使用して作成します。

import com.sun.xml.ws.developer.WSBindingProvider;

HelloPort port = helloService.getHelloPort();  // or something like that...
WSBindingProvider bp = (WSBindingProvider)port;

bp.setOutboundHeader(
  // simple string value as a header, like <simpleHeader>stringValue</simpleHeader>
  Headers.create(new QName("simpleHeader"),"stringValue"),
  // create a header from JAXB object
  Headers.create(jaxbContext,myJaxbObject)
);

それに応じてコードを更新し、再試行してください。また、JAX-WS RI を使用していない場合は、質問を更新して、より多くのコンテキスト情報を提供してください。

更新:呼び出したい Web サービスは、WS-Security/UsernameTokens で保護されているようです。これは最初の質問とは少し異なります。いずれにせよ、ユーザー名とパスワードを送信するようにクライアントを構成するには、Metro ベースの Web サービスに WS-Security UsernameToken プロファイルを実装するというすばらしい記事を確認することをお勧めします(手順 4 にジャンプ)。このステップで NetBeans を使用すると、作業が大幅に楽になる場合があります。

于 2010-02-24T01:47:53.710 に答える
7

また、プロジェクトのビルドに Maven を使用している場合は、次の依存関係を追加する必要があります。

    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
        <version>{currentversion}/version>
    </dependency>

これにより、クラスが提供されますcom.sun.xml.ws.developer.WSBindingProvider

リンク: https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-rt

于 2012-09-17T20:46:34.770 に答える