7 votes

Ajouter un en-tête à toutes les requêtes CXF sortantes

Est-il possible d'ajouter un Header à toutes les connexions cxf sortantes, du côté client.

Utilisation de Spring 3.0 et CXF 2.6.0

9voto

saurzcode Points 763

Je voudrais donner mon avis sur la question. Je suis en train de résoudre le même cas dans mon post -

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

Configuration de Spring :-

<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>

Intercepteur 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();
        }

    }

3voto

Paulius Matulionis Points 6868

Je connais déjà deux façons de procéder. La première consiste à créer votre gestionnaire SOAP et à l'enregistrer en tant que JAX-WS dans votre configuration Spring.

Vérifier ma réponse ici comment créer un gestionnaire SOAP. Comme vous voulez que l'en-tête apparaisse dans la réponse (demande sortante), n'oubliez pas que vous devez ensuite vérifier si le message est sortant :

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

L'autre solution, peut-être plus simple. Mettre l'en-tête directement dans le contexte de la réponse CXF. Veuillez noter que cet exemple n'est qu'une preuve de concept, je ne connais pas la situation réelle dans laquelle vous avez besoin d'informations d'identification dans la réponse. Il montre comment ajouter l'objet "user credentials" dans l'en-tête, vous devez le modifier en fonction de vos besoins.

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);
}

Cette méthode doit être appelée juste après la demande de votre client.

2voto

Trind Points 734

Voici comment j'ai procédé,

Spring.xml

<import resource="classpath:META-INF/cxf/cxf.xml" />

<bean id="cxf" class="org.apache.cxf.bus.spring.SpringBus">
    <property name="outInterceptors">
        <list>
            <ref bean="headerInterceptor"/>
        </list>
    </property>
    <property name="inInterceptors">
        <list>
            <ref bean="headerInterceptor"/>
        </list>
    </property>
</bean>

<bean id="headerInterceptor" class="logging.Interceptor"/>

Intercepteur :

 public class UUIDHeaderInterceptor extends AbstractPhaseInterceptor {

private static final Logger logger = LoggerFactory.getLogger(UUIDHeaderInterceptor.class);

public UUIDHeaderInterceptor() {
    super(Phase.RECEIVE);

}

@Override
public void handleMessage(Message message) throws Fault {

        Map<String, List<String>> headers = (Map<String, List<String>>) message.get(Message.PROTOCOL_HEADERS);
        headers.put(REQUEST_ID_ATTRIBUTE_NAME, Arrays.asList(new String[]{"TEST"}));

   }
 }

@Override
public void handleFault(Message message) {
    handleMessage(message);
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X