7

クライアント側から、すべての発信 cxf 接続にヘッダーを追加することは可能ですか。

Spring 3.0 と CXF 2.6.0 の使用

4

3 に答える 3

9

ここ で 2 セント を 差し上げ ます . ここで私の投稿で同じケースを解決しています-

http://saurzcode.in/2014/05/08/adding-header-to-soap-request-using-cxf-2/

春の構成: -

<jaxws:client id="mywebServiceClient"
    serviceClass="com.saurzcode.TestService"
    address="http://saurzcode.com:8088/mockTestService">

    <jaxws:binding>
        <soap:soapBinding version="1.2" mtomEnabled="true" />
    </jaxws:binding>
</jaxws:client>
<cxf:bus>
    <cxf:outInterceptors>
        <bean class="com.saurzcode.ws.caller.SoapHeaderInterceptor" />
    </cxf:outInterceptors>
</cxf:bus>

CXFインターセプター -

public class SoapHeaderInterceptor extends AbstractSoapInterceptor {

    public SoapHeaderInterceptor() {
        super(Phase.POST_LOGICAL);
    }

    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        List<Header> headers = message.getHeaders();
        TestHeader testHeader = new TestHeader();
        JAXBElement<TestHeader> testHeaders = new ObjectFactory()
        .createTestHeader(testHeader);

        try {
            Header header = new Header(testHeaders.getName(), testHeader,
            new JAXBDataBinding(TestHeader.class));
            headers.add(header);
            message.put(Header.HEADER_LIST, headers);

        } catch (JAXBException e) {
            e.printStackTrace();
        }

    }
于 2014-05-28T06:11:04.573 に答える
2

私はすでにこれを行う2つの方法を知っています。1 つは、SOAP ハンドラーを作成JAX-WSし、Spring 構成でハンドラーとして登録することです。

SOAPハンドラーの作成方法については、こちらの回答を確認してください。ヘッダーを応答 (送信要求) に表示する場合は、メッセージが送信方向かどうかを確認する必要があることを忘れないでください。次のようにします。

Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outbound) {
    //Modify your header.
}

他の、おそらくもっと簡単な方法。ヘッダーを CXF 応答コンテキストに直接入れます。この例は概念の証明にすぎないことに注意してください。応答で資格情報が必要な実際の状況はわかりません。ユーザー資格情報オブジェクトをヘッダーに追加する方法が表示されます。必要に応じて変更する必要があります。

private void modifyResponse(String username, String password) {
    UserCredentials authHeader = new UserCredentials();
    authHeader.setUsername(username);
    authHeader.setPassword(password);
    ArrayList<Header> headers = new ArrayList<Header>(1);
    try {
        Header soapHeader = new Header(
                new QName("http://yournamespaceuri.com/something", "UserCredentials"),
                authHeader,
                new JAXBDataBinding(UserCredentials.class));
        headers.add(soapHeader);
    } catch (JAXBException ex) {
        LOGGER.error("Exception trying to serialize header: {}", ex);
    }
    ((BindingProvider) proxy).getResponseContext().put(Header.HEADER_LIST, headers);
}

このメソッドは、クライアントのリクエストの直後に呼び出す必要があります。

于 2013-08-30T08:37:05.037 に答える