So I added a header on the server side using the code below,
I can see the header in client side logging, but how do I
grab it on the client side?  I tried an interceptor but it is
not finding any headers.  What am I doing wrong?

Server side code:

    Document d = DOMUtils.createDocument();
    Element overflowElem = d.createElement("overflow");
    overflowElem.setTextContent(String.valueOf(overflow));
    QName q = new QName(SCHEMA_PREFIX + "headers_ns.xsd",
"OverflowHeader", "h");
    SoapHeader overflowHeader = new SoapHeader(q, overflowElem);
    ...
    List<Header> headers = CastUtils.cast((List<?>)
messageContext.get(Header.HEADER_LIST));
    ...
    headers.add(overflowHeader);


Client side logging shows:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";>
<soap:Header><overflow>false</overflow></soap:Header>
...

Client side code:

class HeaderInterceptor extends AbstractSoapInterceptor {

    public HeaderInterceptor() {
        super(Phase.READ);
    }

    public void handleMessage(SoapMessage message) throws Fault {
        List<Header> headers = message.getHeaders();
        if(headers.size() == 0) {
            log.info("HEADER.size = 0");
            return;
        }
        for (int i = 0; i < headers.size(); i++) {
            log.info("HEADER " + i + ": " + headers.get(i).getName());
        }
    }
}

Thanks,
Dan


> -----Original Message-----
> From: Daniel Lipofsky [mailto:[EMAIL PROTECTED] 
> Sent: Friday, February 29, 2008 1:23 PM
> To: [email protected]
> Subject: RE: passing a flag from impl method to interceptor
> 
> Those all sound good, but unfortunately I am pretty much
> a web-services newbie, I don't have a clue how to
> implement that, especially the @WebParam sugestion.
> Do I need some entries in the WSDL, etc?
> 
> the old implementation was basically outputing this:
> 
> <soap:Envelope ...
> xmlns:h="http://www.foobar.com/connector-1.5/headers_ns.xsd";>
>     <soap:Header>
>         <h:overflow soap:mustUnderstand="0">false</h:overflow>
>     </soap:Header>
>     ...
> 
> or
>     ...
>     <h:overflow soap:mustUnderstand="0">true</h:overflow>
>     ...
> 
> so there are a few involved: a namespace, a node, and
> an attribute.  I don't have to keep it the same, so maybe
> I can make it a lot simplier, I just need to basically
> communicate overflow=[true|false] somehow.
> 
> Thanks,
> Dan
> 
> On Friday 29 February 2008, Daniel Kulp wrote:
> > 
> > Of course, I typed all that and forgot the most obvious way:
> > 
> > Just add a parameter to your method like:
> > 
> > @WebParam(header = true, mode = Mode.OUT)
> > Holder<String> header
> > 
> > Dan
> > 
> > 
> > 
> > On Friday 29 February 2008, Daniel Kulp wrote:
> > > OK.   This is turning into another FAQ type thing that 
> > possibly needs
> > > a sample....
> > >
> > > There are a couple options open to you:
> > >
> > > First, you need the context injected in:
> > > @Resource
> > > WebServiceContext context;
> > >
> > > 1) Standard JAX-WS API's:  throw the value in the 
> WebServiceContext
> > > and in a SoapHandler, use it to modify the SAAJ object 
> model.   This
> > > is pure JAXWS and would work on any JAX-WS implementation.  The
> > > "problem" is that with the SAAJ model, it breaks streaming and
> > > performance suffers.
> > >
> > > 2) context + CXF interceptor: again, from your impl, throw 
> > a value in
> > > the WebServiceContext and then grab that from the message in your
> > > interceptor.   You can then call the 
> > soapMessage.getHeaders() thing to
> > > get the list of headers and add a Header object to it.
> > >
> > > 3) Context only: no interceptors needed.  In you impl do:
> > >
> > > context.
> > > ... build a org.apache.cxf.headers.Header object ...
> > > List<Header> hdrList = (List<Header>)ctx.get(Header.HEADER_LIST));
> > > hdrList.add(hdr);
> > >
> > > And example of this would be our system test that test this:
> > > 
> > 
> http://svn.apache.org/repos/asf/incubator/cxf/trunk/systests/src/test/
> > >java/org/apache/cxf/systest/outofband/header/
> > >
> > >
> > > 3 is definitely the simplest.   No interceptors needed.  Nothing
> > > really to configure, etc....
> > >
> > >
> > > Dan
> > >
> > > On Friday 29 February 2008, Daniel Lipofsky wrote:
> > > > I have a csae where I want to set something in the SOAP
> > > > response header based on what happened in the execution of
> > > > the method implementation.
> > > >
> > > > I suppose I want to extend AbstractSoapInterceptor, but what
> > > > I can't figure out is how to pass a flag from the method
> > > > to the interceptor.  I thought about sticking it in the
> > > > ServletRequest attribute map but I don't see a way to access
> > > > that from the interceptor.  Any way to do it would be fine.
> > > >
> > > > also is there an example of adding an element to a SOAP header?
> > > >
> > > > Thanks,
> > > > Dan
> 

Reply via email to