On Monday 03 March 2008, Daniel Lipofsky wrote:
> 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?

READ phase is propably too early.   They probably haven't been read yet.   
Change the phase to USER_LOGICAL.

That said, on the client side, like the server side, you don't need the 
interceptor.   

((BindingProvider)proxy).getResponseContext().get(Header.HEADER_LIST);

should return the List<Header> objects.

One more note though:  header elements SHOULD be namespace qualfied per 
the soap spec.   You aren't putting the overflow element into a 
namespace when you create it so many toolkits may have issues with that.   
Use the createElementNS call.

Dan



>
> 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/tes
> >t/
> >
> > > >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



-- 
J. Daniel Kulp
Principal Engineer, IONA
[EMAIL PROTECTED]
http://www.dankulp.com/blog

Reply via email to