Apache CXF: Forwarding an information from an inte

2019-09-09 03:56发布

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.

标签: java jax-ws cxf
2条回答
ら.Afraid
2楼-- · 2019-09-09 04:14

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.

查看更多
【Aperson】
3楼-- · 2019-09-09 04:16

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");
查看更多
登录 后发表回答