简体   繁体   中英

Apache CXF: Forwarding an information from an interceptor to the actual webservice implementation

I'm running a JAX-WS web service which is based on Apache CXF 2.3.1 on a JBoss6 server.

My service offers a function getWeight . This function should return the values in different units (kilos, pounds) depending on an additional information within the SOAP header. For that purpose I have added my own interceptor:

public class MySoapHeaderInterceptor extends AbstractSoapInterceptor
{
    public MySoapHeaderInterceptor()
    {
        super(Phase.USER_PROTOCOL);
    }

    ...
}

The intercepting works fine and I can parse the additional element from the SOAP header and can set up a variable based on this element:

boolean poundsRequested = true;

Now my problem occurs. I don't know how to forward the variable poundsRequested to my actual WebService implementation MyServiceImpl . This class is calling another class ValueReader where I finally need the information from the SOAP header.

I've already tried to set up a global static variable ValueReader.poundsRequested . But such a solution is not thread safe. It might happen that the calls of two clients interfere, and can overwrite each others set up variable.

To sum up : I basically need a possibility to forward a variable from an Apache CXF Interceptor to the actual webservice implementation. Moreover the value of this variable needs to be unique for each request.

In the interceptor, you can save the values that you need on the incoming message:

message.put("my.value", value);

Inside your implementation, you can do one of two things:

1) Have the standard JAXWS WebServiceContext injected via an @Resource thing and call

context.getMessageContext().get("my.value");

2) Since you are tied to CXF anyway, do:

PhaseInterceptorChain.getCurrentMessage().get("my.value");

Ideally, the format in which the weights are requested should be a part of your payload - it does not make sense for it to be a header.

You may not need an interceptor for getting hold of this header, if you are using JAX-WS(recommended with CXF), you can get to this using @WebParam annotation with header attribute set to true.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM