You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Arik Gorelik <ar...@gmail.com> on 2009/10/29 18:01:20 UTC

set headers in soap response

Hello,

I cannot seem to find any example of how to include/set headers/values in
the SOAP response. Is there a CXF example on that? I can think of few ways
to do this, but was wondering if anyone has a best practice sample.

Thank you.
Arik.

Re: set headers in soap response

Posted by Arik Gorelik <ar...@gmail.com>.
I think I figured it out as well.

I looked at the generated code (from wsdl2java) and my TestServiceService
had a public static Qname called TestService which has the correct
targetNamespace. I am just using that QName to create the Header reference
and add to the list of headers in the SoapMessage...

I think that will work.

On Fri, Oct 30, 2009 at 11:52 AM, Arik Gorelik <ar...@gmail.com> wrote:

> Is there a way to retrieve the targetNamespace from the message, its QNames
> (from Version of the message)?
>
> For example if I have something like this on the service classt:
>
>
> @WebService
> (portName = "TestService",
>
> serviceName = "TestServiceService",
>
> *targetNamespace = **"http://example.test.com/services/v01"**, *
>
> endpointInterface = "com.test.services.v01.TestService"
>
> )
> Is the specific 'targetNamespace' retrievable from anywhere of the
> SoapMessage or its attributes?
>
> I've tried the namespaceURI from:
>
> 1. message.getVersion().getEnvelope().getNameSpaceURI() but that gives me "
> http://schemas.xmlsoap.org/soap/envelope/"
>  2. message.getVersion().getNamespace() but that gives me "
> http://schemas.xmlsoap.org/soap/envelope/"
>
> Seems like since I am creating the Header on the fly without binding it,
> the targetNamespace is not the one of the service. Maybe I am totally off
> here.
>
>
>   On Fri, Oct 30, 2009 at 10:59 AM, Arik Gorelik <ar...@gmail.com>wrote:
>
>> I figured out how to change the element name, it is just the 'localPart'
>> attribute of the QName. Still struggling on how to get the correct
>> targetNamespace (for the service endpoint) instead of the default one
>> xmlns="http://schemas.xmlsoap.org/soap/envelope/
>>
>>
>> On Fri, Oct 30, 2009 at 10:31 AM, Arik Gorelik <ar...@gmail.com>wrote:
>>
>>> That's awesome! I am able to get the value back in the header response.
>>> Just need to figure out how to set the name of the element (default is
>>> 'Header').
>>>
>>> Still, the header part seems kind of tricky to me. Perhaps the
>>> @WebParam(header=true) way is much simpler, but unfortunately I cannot use
>>> that.
>>>
>>>   On Fri, Oct 30, 2009 at 9:36 AM, Daniel Kulp <dk...@apache.org> wrote:
>>>
>>>>
>>>> If it's something as simple as just a String, it's probably easier to
>>>> just use
>>>> a DOM and don't bother with the Databinding stuff.   Using some CXF
>>>> utils:
>>>>
>>>> Document doc = XMLUtils.newDocument();
>>>> Element el  = XMLUtils.createElementNS(doc, qname);
>>>> el.appendChild(XMLUtils.createTextNode(doc, "12345-67890");
>>>>
>>>> new Header(qname, el)
>>>>
>>>> If there isn't a databinding, it assumes a DOM.
>>>>
>>>> Dan
>>>>
>>>>
>>>>
>>>> On Fri October 30 2009 12:08:27 pm Arik Gorelik wrote:
>>>> > Great. Thank you for the pointers. I am able to get the 'SoapMessage'
>>>> > reference and call getHeaders, get the List, etc, etc. My interceptor
>>>> is in
>>>> > the PRE_STREAM phase and I am also experimenting in the MARSHAL phase
>>>> as
>>>> > well.
>>>> >
>>>> > However, I cannot seem to figure out how to bind my string literal
>>>> "id" to
>>>> > the actual header element. Is there a utility or an easy way to create
>>>> a
>>>> > 'Header' instance? I am using the constructor, but not 100% sure what
>>>> I
>>>> >  need to pass for the DataBinding. Here is my code:
>>>> >
>>>> > QName qname = new QName(message.getVersion().getHeader());
>>>> > Object obj = "12345-67890";
>>>> > DataBinding db = ?; // where can I get this?
>>>> >
>>>> > message.getHeaders().add(*new* Header(qname, obj, db));
>>>> >
>>>> > I really appreciate your help.
>>>> > Arik.
>>>> >
>>>> > On Fri, Oct 30, 2009 at 7:06 AM, Daniel Kulp <dk...@apache.org>
>>>> wrote:
>>>> > > On Thu October 29 2009 9:07:16 pm Arik Gorelik wrote:
>>>> > > > Basically, I am wondering if it is possible to set something in
>>>> the
>>>> > > > soap response header in the interceptor (not in the service method
>>>> > > > implementation) during PRE_STREAM phase.
>>>> > >
>>>> > > Well, yea, but in an interceptor you have two options:
>>>> > >
>>>> > > 1) Exactly the same way as in (4).
>>>> > > message.get(Header.HEADER_LIST)
>>>> > > returns the List<Header> (or null in which case you create a
>>>> List<Header>
>>>> > > and
>>>> > > add it)
>>>> > >
>>>> > > 2) If you interceptor is Interceptor<SoapMessage> or if you cast the
>>>> > > passed in
>>>> > > Message to a SoapMessage, there is a getHeaders() call on
>>>> soapmessage.
>>>> > >
>>>> > >
>>>> > > Dan
>>>> > >
>>>> > > > On Thu, Oct 29, 2009 at 2:09 PM, Arik Gorelik <arikgdev@gmail.com
>>>> >
>>>> > >
>>>> > > wrote:
>>>> > > > > Seems like if there is a heavy dependency on CXF in the project
>>>> (as
>>>> > > > > in
>>>> > >
>>>> > > my
>>>> > >
>>>> > > > > case), the best option is this one:
>>>> > > > >
>>>> > > > > 4. CXF proprietary way: In the context
>>>> > > > > (BindingProvider.getRequestContext() on client,
>>>> WebServiceContext on
>>>> > > > > server), you can add a
>>>> > > > > List<org.apache.cxf.headers.Header> with the key
>>>> Header.HEADER_LIST.
>>>> > >
>>>> > > The
>>>> > >
>>>> > > > > headers in the list are streamed at the appropriate time to the
>>>> wire
>>>> > > > > according to the databinding object found in the Header object.
>>>> Like
>>>> > > > > option 1, this doesn't require changes to wsdl or method
>>>> signatures.
>>>> > > > > However, it's much faster as it doesn't break streaming and the
>>>> > > > > memory overhead is less.
>>>> > > > >
>>>> > > > > Let's say I want to return an ID in the header with every
>>>> response,
>>>> > > > > is that something I can do in the PRE_STREAM interceptor on the
>>>> OUT
>>>> > > > > scope?
>>>> > > > >
>>>> > > > > Arik.
>>>> > > > >
>>>> > > > >   On Thu, Oct 29, 2009 at 10:48 AM, Daniel Kulp <
>>>> dkulp@apache.org>
>>>> > >
>>>> > > wrote:
>>>> > > > >>  On Thu October 29 2009 1:01:20 pm Arik Gorelik wrote:
>>>> > > > >> > Hello,
>>>> > > > >> >
>>>> > > > >> > I cannot seem to find any example of how to include/set
>>>> > >
>>>> > > headers/values
>>>> > >
>>>> > > > >> in
>>>> > > > >>
>>>> > > > >> > the SOAP response. Is there a CXF example on that? I can
>>>> think of
>>>> > >
>>>> > > few
>>>> > >
>>>> > > > >> ways
>>>> > > > >>
>>>> > > > >> > to do this, but was wondering if anyone has a best practice
>>>> > > > >> > sample.
>>>> > > > >>
>>>> > > > >> See the faq:
>>>> > > > >>
>>>> > > > >> http://cxf.apache.org/faq.html
>>>> > > > >>
>>>> > > > >>
>>>> > > > >>
>>>> > > > >> --
>>>> > > > >> Daniel Kulp
>>>> > > > >> dkulp@apache.org
>>>> > > > >> http://www.dankulp.com/blog
>>>> > >
>>>> > > --
>>>> > >  Daniel Kulp
>>>> > > dkulp@apache.org
>>>> > > http://www.dankulp.com/blog
>>>> >
>>>>
>>>> --
>>>>  Daniel Kulp
>>>> dkulp@apache.org
>>>> http://www.dankulp.com/blog
>>>>
>>>
>>>
>>
>

Re: set headers in soap response

Posted by Arik Gorelik <ar...@gmail.com>.
Is there a way to retrieve the targetNamespace from the message, its QNames
(from Version of the message)?

For example if I have something like this on the service classt:


@WebService(portName = "TestService",

serviceName = "TestServiceService",

*targetNamespace = **"http://example.test.com/services/v01"**, *

endpointInterface = "com.test.services.v01.TestService"

)
Is the specific 'targetNamespace' retrievable from anywhere of the
SoapMessage or its attributes?

I've tried the namespaceURI from:

1. message.getVersion().getEnvelope().getNameSpaceURI() but that gives me "
http://schemas.xmlsoap.org/soap/envelope/"
 2. message.getVersion().getNamespace() but that gives me "
http://schemas.xmlsoap.org/soap/envelope/"

Seems like since I am creating the Header on the fly without binding it, the
targetNamespace is not the one of the service. Maybe I am totally off here.


On Fri, Oct 30, 2009 at 10:59 AM, Arik Gorelik <ar...@gmail.com> wrote:

> I figured out how to change the element name, it is just the 'localPart'
> attribute of the QName. Still struggling on how to get the correct
> targetNamespace (for the service endpoint) instead of the default one
> xmlns="http://schemas.xmlsoap.org/soap/envelope/
>
>
> On Fri, Oct 30, 2009 at 10:31 AM, Arik Gorelik <ar...@gmail.com> wrote:
>
>> That's awesome! I am able to get the value back in the header response.
>> Just need to figure out how to set the name of the element (default is
>> 'Header').
>>
>> Still, the header part seems kind of tricky to me. Perhaps the
>> @WebParam(header=true) way is much simpler, but unfortunately I cannot use
>> that.
>>
>>   On Fri, Oct 30, 2009 at 9:36 AM, Daniel Kulp <dk...@apache.org> wrote:
>>
>>>
>>> If it's something as simple as just a String, it's probably easier to
>>> just use
>>> a DOM and don't bother with the Databinding stuff.   Using some CXF
>>> utils:
>>>
>>> Document doc = XMLUtils.newDocument();
>>> Element el  = XMLUtils.createElementNS(doc, qname);
>>> el.appendChild(XMLUtils.createTextNode(doc, "12345-67890");
>>>
>>> new Header(qname, el)
>>>
>>> If there isn't a databinding, it assumes a DOM.
>>>
>>> Dan
>>>
>>>
>>>
>>> On Fri October 30 2009 12:08:27 pm Arik Gorelik wrote:
>>> > Great. Thank you for the pointers. I am able to get the 'SoapMessage'
>>> > reference and call getHeaders, get the List, etc, etc. My interceptor
>>> is in
>>> > the PRE_STREAM phase and I am also experimenting in the MARSHAL phase
>>> as
>>> > well.
>>> >
>>> > However, I cannot seem to figure out how to bind my string literal "id"
>>> to
>>> > the actual header element. Is there a utility or an easy way to create
>>> a
>>> > 'Header' instance? I am using the constructor, but not 100% sure what I
>>> >  need to pass for the DataBinding. Here is my code:
>>> >
>>> > QName qname = new QName(message.getVersion().getHeader());
>>> > Object obj = "12345-67890";
>>> > DataBinding db = ?; // where can I get this?
>>> >
>>> > message.getHeaders().add(*new* Header(qname, obj, db));
>>> >
>>> > I really appreciate your help.
>>> > Arik.
>>> >
>>> > On Fri, Oct 30, 2009 at 7:06 AM, Daniel Kulp <dk...@apache.org> wrote:
>>> > > On Thu October 29 2009 9:07:16 pm Arik Gorelik wrote:
>>> > > > Basically, I am wondering if it is possible to set something in the
>>> > > > soap response header in the interceptor (not in the service method
>>> > > > implementation) during PRE_STREAM phase.
>>> > >
>>> > > Well, yea, but in an interceptor you have two options:
>>> > >
>>> > > 1) Exactly the same way as in (4).
>>> > > message.get(Header.HEADER_LIST)
>>> > > returns the List<Header> (or null in which case you create a
>>> List<Header>
>>> > > and
>>> > > add it)
>>> > >
>>> > > 2) If you interceptor is Interceptor<SoapMessage> or if you cast the
>>> > > passed in
>>> > > Message to a SoapMessage, there is a getHeaders() call on
>>> soapmessage.
>>> > >
>>> > >
>>> > > Dan
>>> > >
>>> > > > On Thu, Oct 29, 2009 at 2:09 PM, Arik Gorelik <ar...@gmail.com>
>>> > >
>>> > > wrote:
>>> > > > > Seems like if there is a heavy dependency on CXF in the project
>>> (as
>>> > > > > in
>>> > >
>>> > > my
>>> > >
>>> > > > > case), the best option is this one:
>>> > > > >
>>> > > > > 4. CXF proprietary way: In the context
>>> > > > > (BindingProvider.getRequestContext() on client, WebServiceContext
>>> on
>>> > > > > server), you can add a
>>> > > > > List<org.apache.cxf.headers.Header> with the key
>>> Header.HEADER_LIST.
>>> > >
>>> > > The
>>> > >
>>> > > > > headers in the list are streamed at the appropriate time to the
>>> wire
>>> > > > > according to the databinding object found in the Header object.
>>> Like
>>> > > > > option 1, this doesn't require changes to wsdl or method
>>> signatures.
>>> > > > > However, it's much faster as it doesn't break streaming and the
>>> > > > > memory overhead is less.
>>> > > > >
>>> > > > > Let's say I want to return an ID in the header with every
>>> response,
>>> > > > > is that something I can do in the PRE_STREAM interceptor on the
>>> OUT
>>> > > > > scope?
>>> > > > >
>>> > > > > Arik.
>>> > > > >
>>> > > > >   On Thu, Oct 29, 2009 at 10:48 AM, Daniel Kulp <
>>> dkulp@apache.org>
>>> > >
>>> > > wrote:
>>> > > > >>  On Thu October 29 2009 1:01:20 pm Arik Gorelik wrote:
>>> > > > >> > Hello,
>>> > > > >> >
>>> > > > >> > I cannot seem to find any example of how to include/set
>>> > >
>>> > > headers/values
>>> > >
>>> > > > >> in
>>> > > > >>
>>> > > > >> > the SOAP response. Is there a CXF example on that? I can think
>>> of
>>> > >
>>> > > few
>>> > >
>>> > > > >> ways
>>> > > > >>
>>> > > > >> > to do this, but was wondering if anyone has a best practice
>>> > > > >> > sample.
>>> > > > >>
>>> > > > >> See the faq:
>>> > > > >>
>>> > > > >> http://cxf.apache.org/faq.html
>>> > > > >>
>>> > > > >>
>>> > > > >>
>>> > > > >> --
>>> > > > >> Daniel Kulp
>>> > > > >> dkulp@apache.org
>>> > > > >> http://www.dankulp.com/blog
>>> > >
>>> > > --
>>> > >  Daniel Kulp
>>> > > dkulp@apache.org
>>> > > http://www.dankulp.com/blog
>>> >
>>>
>>> --
>>>  Daniel Kulp
>>> dkulp@apache.org
>>> http://www.dankulp.com/blog
>>>
>>
>>
>

Re: set headers in soap response

Posted by Arik Gorelik <ar...@gmail.com>.
I figured out how to change the element name, it is just the 'localPart'
attribute of the QName. Still struggling on how to get the correct
targetNamespace (for the service endpoint) instead of the default one
xmlns="http://schemas.xmlsoap.org/soap/envelope/

On Fri, Oct 30, 2009 at 10:31 AM, Arik Gorelik <ar...@gmail.com> wrote:

> That's awesome! I am able to get the value back in the header response.
> Just need to figure out how to set the name of the element (default is
> 'Header').
>
> Still, the header part seems kind of tricky to me. Perhaps the
> @WebParam(header=true) way is much simpler, but unfortunately I cannot use
> that.
>
>   On Fri, Oct 30, 2009 at 9:36 AM, Daniel Kulp <dk...@apache.org> wrote:
>
>>
>> If it's something as simple as just a String, it's probably easier to just
>> use
>> a DOM and don't bother with the Databinding stuff.   Using some CXF utils:
>>
>> Document doc = XMLUtils.newDocument();
>> Element el  = XMLUtils.createElementNS(doc, qname);
>> el.appendChild(XMLUtils.createTextNode(doc, "12345-67890");
>>
>> new Header(qname, el)
>>
>> If there isn't a databinding, it assumes a DOM.
>>
>> Dan
>>
>>
>>
>> On Fri October 30 2009 12:08:27 pm Arik Gorelik wrote:
>> > Great. Thank you for the pointers. I am able to get the 'SoapMessage'
>> > reference and call getHeaders, get the List, etc, etc. My interceptor is
>> in
>> > the PRE_STREAM phase and I am also experimenting in the MARSHAL phase as
>> > well.
>> >
>> > However, I cannot seem to figure out how to bind my string literal "id"
>> to
>> > the actual header element. Is there a utility or an easy way to create a
>> > 'Header' instance? I am using the constructor, but not 100% sure what I
>> >  need to pass for the DataBinding. Here is my code:
>> >
>> > QName qname = new QName(message.getVersion().getHeader());
>> > Object obj = "12345-67890";
>> > DataBinding db = ?; // where can I get this?
>> >
>> > message.getHeaders().add(*new* Header(qname, obj, db));
>> >
>> > I really appreciate your help.
>> > Arik.
>> >
>> > On Fri, Oct 30, 2009 at 7:06 AM, Daniel Kulp <dk...@apache.org> wrote:
>> > > On Thu October 29 2009 9:07:16 pm Arik Gorelik wrote:
>> > > > Basically, I am wondering if it is possible to set something in the
>> > > > soap response header in the interceptor (not in the service method
>> > > > implementation) during PRE_STREAM phase.
>> > >
>> > > Well, yea, but in an interceptor you have two options:
>> > >
>> > > 1) Exactly the same way as in (4).
>> > > message.get(Header.HEADER_LIST)
>> > > returns the List<Header> (or null in which case you create a
>> List<Header>
>> > > and
>> > > add it)
>> > >
>> > > 2) If you interceptor is Interceptor<SoapMessage> or if you cast the
>> > > passed in
>> > > Message to a SoapMessage, there is a getHeaders() call on soapmessage.
>> > >
>> > >
>> > > Dan
>> > >
>> > > > On Thu, Oct 29, 2009 at 2:09 PM, Arik Gorelik <ar...@gmail.com>
>> > >
>> > > wrote:
>> > > > > Seems like if there is a heavy dependency on CXF in the project
>> (as
>> > > > > in
>> > >
>> > > my
>> > >
>> > > > > case), the best option is this one:
>> > > > >
>> > > > > 4. CXF proprietary way: In the context
>> > > > > (BindingProvider.getRequestContext() on client, WebServiceContext
>> on
>> > > > > server), you can add a
>> > > > > List<org.apache.cxf.headers.Header> with the key
>> Header.HEADER_LIST.
>> > >
>> > > The
>> > >
>> > > > > headers in the list are streamed at the appropriate time to the
>> wire
>> > > > > according to the databinding object found in the Header object.
>> Like
>> > > > > option 1, this doesn't require changes to wsdl or method
>> signatures.
>> > > > > However, it's much faster as it doesn't break streaming and the
>> > > > > memory overhead is less.
>> > > > >
>> > > > > Let's say I want to return an ID in the header with every
>> response,
>> > > > > is that something I can do in the PRE_STREAM interceptor on the
>> OUT
>> > > > > scope?
>> > > > >
>> > > > > Arik.
>> > > > >
>> > > > >   On Thu, Oct 29, 2009 at 10:48 AM, Daniel Kulp <dkulp@apache.org
>> >
>> > >
>> > > wrote:
>> > > > >>  On Thu October 29 2009 1:01:20 pm Arik Gorelik wrote:
>> > > > >> > Hello,
>> > > > >> >
>> > > > >> > I cannot seem to find any example of how to include/set
>> > >
>> > > headers/values
>> > >
>> > > > >> in
>> > > > >>
>> > > > >> > the SOAP response. Is there a CXF example on that? I can think
>> of
>> > >
>> > > few
>> > >
>> > > > >> ways
>> > > > >>
>> > > > >> > to do this, but was wondering if anyone has a best practice
>> > > > >> > sample.
>> > > > >>
>> > > > >> See the faq:
>> > > > >>
>> > > > >> http://cxf.apache.org/faq.html
>> > > > >>
>> > > > >>
>> > > > >>
>> > > > >> --
>> > > > >> Daniel Kulp
>> > > > >> dkulp@apache.org
>> > > > >> http://www.dankulp.com/blog
>> > >
>> > > --
>> > >  Daniel Kulp
>> > > dkulp@apache.org
>> > > http://www.dankulp.com/blog
>> >
>>
>> --
>>  Daniel Kulp
>> dkulp@apache.org
>> http://www.dankulp.com/blog
>>
>
>

Re: set headers in soap response

Posted by Arik Gorelik <ar...@gmail.com>.
That's awesome! I am able to get the value back in the header response. Just
need to figure out how to set the name of the element (default is 'Header').


Still, the header part seems kind of tricky to me. Perhaps the
@WebParam(header=true) way is much simpler, but unfortunately I cannot use
that.

On Fri, Oct 30, 2009 at 9:36 AM, Daniel Kulp <dk...@apache.org> wrote:

>
> If it's something as simple as just a String, it's probably easier to just
> use
> a DOM and don't bother with the Databinding stuff.   Using some CXF utils:
>
> Document doc = XMLUtils.newDocument();
> Element el  = XMLUtils.createElementNS(doc, qname);
> el.appendChild(XMLUtils.createTextNode(doc, "12345-67890");
>
> new Header(qname, el)
>
> If there isn't a databinding, it assumes a DOM.
>
> Dan
>
>
>
> On Fri October 30 2009 12:08:27 pm Arik Gorelik wrote:
> > Great. Thank you for the pointers. I am able to get the 'SoapMessage'
> > reference and call getHeaders, get the List, etc, etc. My interceptor is
> in
> > the PRE_STREAM phase and I am also experimenting in the MARSHAL phase as
> > well.
> >
> > However, I cannot seem to figure out how to bind my string literal "id"
> to
> > the actual header element. Is there a utility or an easy way to create a
> > 'Header' instance? I am using the constructor, but not 100% sure what I
> >  need to pass for the DataBinding. Here is my code:
> >
> > QName qname = new QName(message.getVersion().getHeader());
> > Object obj = "12345-67890";
> > DataBinding db = ?; // where can I get this?
> >
> > message.getHeaders().add(*new* Header(qname, obj, db));
> >
> > I really appreciate your help.
> > Arik.
> >
> > On Fri, Oct 30, 2009 at 7:06 AM, Daniel Kulp <dk...@apache.org> wrote:
> > > On Thu October 29 2009 9:07:16 pm Arik Gorelik wrote:
> > > > Basically, I am wondering if it is possible to set something in the
> > > > soap response header in the interceptor (not in the service method
> > > > implementation) during PRE_STREAM phase.
> > >
> > > Well, yea, but in an interceptor you have two options:
> > >
> > > 1) Exactly the same way as in (4).
> > > message.get(Header.HEADER_LIST)
> > > returns the List<Header> (or null in which case you create a
> List<Header>
> > > and
> > > add it)
> > >
> > > 2) If you interceptor is Interceptor<SoapMessage> or if you cast the
> > > passed in
> > > Message to a SoapMessage, there is a getHeaders() call on soapmessage.
> > >
> > >
> > > Dan
> > >
> > > > On Thu, Oct 29, 2009 at 2:09 PM, Arik Gorelik <ar...@gmail.com>
> > >
> > > wrote:
> > > > > Seems like if there is a heavy dependency on CXF in the project (as
> > > > > in
> > >
> > > my
> > >
> > > > > case), the best option is this one:
> > > > >
> > > > > 4. CXF proprietary way: In the context
> > > > > (BindingProvider.getRequestContext() on client, WebServiceContext
> on
> > > > > server), you can add a
> > > > > List<org.apache.cxf.headers.Header> with the key
> Header.HEADER_LIST.
> > >
> > > The
> > >
> > > > > headers in the list are streamed at the appropriate time to the
> wire
> > > > > according to the databinding object found in the Header object.
> Like
> > > > > option 1, this doesn't require changes to wsdl or method
> signatures.
> > > > > However, it's much faster as it doesn't break streaming and the
> > > > > memory overhead is less.
> > > > >
> > > > > Let's say I want to return an ID in the header with every response,
> > > > > is that something I can do in the PRE_STREAM interceptor on the OUT
> > > > > scope?
> > > > >
> > > > > Arik.
> > > > >
> > > > >   On Thu, Oct 29, 2009 at 10:48 AM, Daniel Kulp <dk...@apache.org>
> > >
> > > wrote:
> > > > >>  On Thu October 29 2009 1:01:20 pm Arik Gorelik wrote:
> > > > >> > Hello,
> > > > >> >
> > > > >> > I cannot seem to find any example of how to include/set
> > >
> > > headers/values
> > >
> > > > >> in
> > > > >>
> > > > >> > the SOAP response. Is there a CXF example on that? I can think
> of
> > >
> > > few
> > >
> > > > >> ways
> > > > >>
> > > > >> > to do this, but was wondering if anyone has a best practice
> > > > >> > sample.
> > > > >>
> > > > >> See the faq:
> > > > >>
> > > > >> http://cxf.apache.org/faq.html
> > > > >>
> > > > >>
> > > > >>
> > > > >> --
> > > > >> Daniel Kulp
> > > > >> dkulp@apache.org
> > > > >> http://www.dankulp.com/blog
> > >
> > > --
> > >  Daniel Kulp
> > > dkulp@apache.org
> > > http://www.dankulp.com/blog
> >
>
> --
>  Daniel Kulp
> dkulp@apache.org
> http://www.dankulp.com/blog
>

Re: set headers in soap response

Posted by Daniel Kulp <dk...@apache.org>.
If it's something as simple as just a String, it's probably easier to just use 
a DOM and don't bother with the Databinding stuff.   Using some CXF utils:

Document doc = XMLUtils.newDocument();
Element el  = XMLUtils.createElementNS(doc, qname);
el.appendChild(XMLUtils.createTextNode(doc, "12345-67890");

new Header(qname, el)

If there isn't a databinding, it assumes a DOM.

Dan



On Fri October 30 2009 12:08:27 pm Arik Gorelik wrote:
> Great. Thank you for the pointers. I am able to get the 'SoapMessage'
> reference and call getHeaders, get the List, etc, etc. My interceptor is in
> the PRE_STREAM phase and I am also experimenting in the MARSHAL phase as
> well.
> 
> However, I cannot seem to figure out how to bind my string literal "id" to
> the actual header element. Is there a utility or an easy way to create a
> 'Header' instance? I am using the constructor, but not 100% sure what I
>  need to pass for the DataBinding. Here is my code:
> 
> QName qname = new QName(message.getVersion().getHeader());
> Object obj = "12345-67890";
> DataBinding db = ?; // where can I get this?
> 
> message.getHeaders().add(*new* Header(qname, obj, db));
> 
> I really appreciate your help.
> Arik.
> 
> On Fri, Oct 30, 2009 at 7:06 AM, Daniel Kulp <dk...@apache.org> wrote:
> > On Thu October 29 2009 9:07:16 pm Arik Gorelik wrote:
> > > Basically, I am wondering if it is possible to set something in the
> > > soap response header in the interceptor (not in the service method
> > > implementation) during PRE_STREAM phase.
> >
> > Well, yea, but in an interceptor you have two options:
> >
> > 1) Exactly the same way as in (4).
> > message.get(Header.HEADER_LIST)
> > returns the List<Header> (or null in which case you create a List<Header>
> > and
> > add it)
> >
> > 2) If you interceptor is Interceptor<SoapMessage> or if you cast the
> > passed in
> > Message to a SoapMessage, there is a getHeaders() call on soapmessage.
> >
> >
> > Dan
> >
> > > On Thu, Oct 29, 2009 at 2:09 PM, Arik Gorelik <ar...@gmail.com>
> >
> > wrote:
> > > > Seems like if there is a heavy dependency on CXF in the project (as
> > > > in
> >
> > my
> >
> > > > case), the best option is this one:
> > > >
> > > > 4. CXF proprietary way: In the context
> > > > (BindingProvider.getRequestContext() on client, WebServiceContext on
> > > > server), you can add a
> > > > List<org.apache.cxf.headers.Header> with the key Header.HEADER_LIST.
> >
> > The
> >
> > > > headers in the list are streamed at the appropriate time to the wire
> > > > according to the databinding object found in the Header object. Like
> > > > option 1, this doesn't require changes to wsdl or method signatures.
> > > > However, it's much faster as it doesn't break streaming and the
> > > > memory overhead is less.
> > > >
> > > > Let's say I want to return an ID in the header with every response,
> > > > is that something I can do in the PRE_STREAM interceptor on the OUT
> > > > scope?
> > > >
> > > > Arik.
> > > >
> > > >   On Thu, Oct 29, 2009 at 10:48 AM, Daniel Kulp <dk...@apache.org>
> >
> > wrote:
> > > >>  On Thu October 29 2009 1:01:20 pm Arik Gorelik wrote:
> > > >> > Hello,
> > > >> >
> > > >> > I cannot seem to find any example of how to include/set
> >
> > headers/values
> >
> > > >> in
> > > >>
> > > >> > the SOAP response. Is there a CXF example on that? I can think of
> >
> > few
> >
> > > >> ways
> > > >>
> > > >> > to do this, but was wondering if anyone has a best practice
> > > >> > sample.
> > > >>
> > > >> See the faq:
> > > >>
> > > >> http://cxf.apache.org/faq.html
> > > >>
> > > >>
> > > >>
> > > >> --
> > > >> Daniel Kulp
> > > >> dkulp@apache.org
> > > >> http://www.dankulp.com/blog
> >
> > --
> >  Daniel Kulp
> > dkulp@apache.org
> > http://www.dankulp.com/blog
> 

-- 
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog

Re: set headers in soap response

Posted by Arik Gorelik <ar...@gmail.com>.
Great. Thank you for the pointers. I am able to get the 'SoapMessage'
reference and call getHeaders, get the List, etc, etc. My interceptor is in
the PRE_STREAM phase and I am also experimenting in the MARSHAL phase as
well.

However, I cannot seem to figure out how to bind my string literal "id" to
the actual header element. Is there a utility or an easy way to create a
'Header' instance? I am using the constructor, but not 100% sure what I need
to pass for the DataBinding. Here is my code:

QName qname = new QName(message.getVersion().getHeader());
Object obj = "12345-67890";
DataBinding db = ?; // where can I get this?

message.getHeaders().add(*new* Header(qname, obj, db));

I really appreciate your help.
Arik.


On Fri, Oct 30, 2009 at 7:06 AM, Daniel Kulp <dk...@apache.org> wrote:

> On Thu October 29 2009 9:07:16 pm Arik Gorelik wrote:
> > Basically, I am wondering if it is possible to set something in the soap
> > response header in the interceptor (not in the service method
> > implementation) during PRE_STREAM phase.
>
> Well, yea, but in an interceptor you have two options:
>
> 1) Exactly the same way as in (4).
> message.get(Header.HEADER_LIST)
> returns the List<Header> (or null in which case you create a List<Header>
> and
> add it)
>
> 2) If you interceptor is Interceptor<SoapMessage> or if you cast the passed
> in
> Message to a SoapMessage, there is a getHeaders() call on soapmessage.
>
>
> Dan
>
>
> >
> > On Thu, Oct 29, 2009 at 2:09 PM, Arik Gorelik <ar...@gmail.com>
> wrote:
> > > Seems like if there is a heavy dependency on CXF in the project (as in
> my
> > > case), the best option is this one:
> > >
> > > 4. CXF proprietary way: In the context
> > > (BindingProvider.getRequestContext() on client, WebServiceContext on
> > > server), you can add a
> > > List<org.apache.cxf.headers.Header> with the key Header.HEADER_LIST.
> The
> > > headers in the list are streamed at the appropriate time to the wire
> > > according to the databinding object found in the Header object. Like
> > > option 1, this doesn't require changes to wsdl or method signatures.
> > > However, it's much faster as it doesn't break streaming and the memory
> > > overhead is less.
> > >
> > > Let's say I want to return an ID in the header with every response, is
> > > that something I can do in the PRE_STREAM interceptor on the OUT scope?
> > >
> > > Arik.
> > >
> > >   On Thu, Oct 29, 2009 at 10:48 AM, Daniel Kulp <dk...@apache.org>
> wrote:
> > >>  On Thu October 29 2009 1:01:20 pm Arik Gorelik wrote:
> > >> > Hello,
> > >> >
> > >> > I cannot seem to find any example of how to include/set
> headers/values
> > >>
> > >> in
> > >>
> > >> > the SOAP response. Is there a CXF example on that? I can think of
> few
> > >>
> > >> ways
> > >>
> > >> > to do this, but was wondering if anyone has a best practice sample.
> > >>
> > >> See the faq:
> > >>
> > >> http://cxf.apache.org/faq.html
> > >>
> > >>
> > >>
> > >> --
> > >> Daniel Kulp
> > >> dkulp@apache.org
> > >> http://www.dankulp.com/blog
> >
>
> --
>  Daniel Kulp
> dkulp@apache.org
> http://www.dankulp.com/blog
>

Re: set headers in soap response

Posted by Daniel Kulp <dk...@apache.org>.
On Thu October 29 2009 9:07:16 pm Arik Gorelik wrote:
> Basically, I am wondering if it is possible to set something in the soap
> response header in the interceptor (not in the service method
> implementation) during PRE_STREAM phase.

Well, yea, but in an interceptor you have two options:

1) Exactly the same way as in (4).  
message.get(Header.HEADER_LIST) 
returns the List<Header> (or null in which case you create a List<Header> and 
add it)

2) If you interceptor is Interceptor<SoapMessage> or if you cast the passed in 
Message to a SoapMessage, there is a getHeaders() call on soapmessage.


Dan


> 
> On Thu, Oct 29, 2009 at 2:09 PM, Arik Gorelik <ar...@gmail.com> wrote:
> > Seems like if there is a heavy dependency on CXF in the project (as in my
> > case), the best option is this one:
> >
> > 4. CXF proprietary way: In the context
> > (BindingProvider.getRequestContext() on client, WebServiceContext on
> > server), you can add a
> > List<org.apache.cxf.headers.Header> with the key Header.HEADER_LIST. The
> > headers in the list are streamed at the appropriate time to the wire
> > according to the databinding object found in the Header object. Like
> > option 1, this doesn't require changes to wsdl or method signatures.
> > However, it's much faster as it doesn't break streaming and the memory
> > overhead is less.
> >
> > Let's say I want to return an ID in the header with every response, is
> > that something I can do in the PRE_STREAM interceptor on the OUT scope?
> >
> > Arik.
> >
> >   On Thu, Oct 29, 2009 at 10:48 AM, Daniel Kulp <dk...@apache.org> wrote:
> >>  On Thu October 29 2009 1:01:20 pm Arik Gorelik wrote:
> >> > Hello,
> >> >
> >> > I cannot seem to find any example of how to include/set headers/values
> >>
> >> in
> >>
> >> > the SOAP response. Is there a CXF example on that? I can think of few
> >>
> >> ways
> >>
> >> > to do this, but was wondering if anyone has a best practice sample.
> >>
> >> See the faq:
> >>
> >> http://cxf.apache.org/faq.html
> >>
> >>
> >>
> >> --
> >> Daniel Kulp
> >> dkulp@apache.org
> >> http://www.dankulp.com/blog
> 

-- 
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog

Re: set headers in soap response

Posted by Arik Gorelik <ar...@gmail.com>.
Basically, I am wondering if it is possible to set something in the soap
response header in the interceptor (not in the service method
implementation) during PRE_STREAM phase.

On Thu, Oct 29, 2009 at 2:09 PM, Arik Gorelik <ar...@gmail.com> wrote:

> Seems like if there is a heavy dependency on CXF in the project (as in my
> case), the best option is this one:
>
> 4. CXF proprietary way: In the context (BindingProvider.getRequestContext()
> on client, WebServiceContext on server), you can add a
> List<org.apache.cxf.headers.Header> with the key Header.HEADER_LIST. The
> headers in the list are streamed at the appropriate time to the wire
> according to the databinding object found in the Header object. Like option
> 1, this doesn't require changes to wsdl or method signatures. However, it's
> much faster as it doesn't break streaming and the memory overhead is less.
>
> Let's say I want to return an ID in the header with every response, is that
> something I can do in the PRE_STREAM interceptor on the OUT scope?
>
> Arik.
>   On Thu, Oct 29, 2009 at 10:48 AM, Daniel Kulp <dk...@apache.org> wrote:
>
>>  On Thu October 29 2009 1:01:20 pm Arik Gorelik wrote:
>> > Hello,
>> >
>> > I cannot seem to find any example of how to include/set headers/values
>> in
>> > the SOAP response. Is there a CXF example on that? I can think of few
>> ways
>> > to do this, but was wondering if anyone has a best practice sample.
>>
>> See the faq:
>>
>> http://cxf.apache.org/faq.html
>>
>>
>>
>> --
>> Daniel Kulp
>> dkulp@apache.org
>> http://www.dankulp.com/blog
>>
>
>

Re: set headers in soap response

Posted by Arik Gorelik <ar...@gmail.com>.
Seems like if there is a heavy dependency on CXF in the project (as in my
case), the best option is this one:

4. CXF proprietary way: In the context (BindingProvider.getRequestContext()
on client, WebServiceContext on server), you can add a
List<org.apache.cxf.headers.Header> with the key Header.HEADER_LIST. The
headers in the list are streamed at the appropriate time to the wire
according to the databinding object found in the Header object. Like option
1, this doesn't require changes to wsdl or method signatures. However, it's
much faster as it doesn't break streaming and the memory overhead is less.

Let's say I want to return an ID in the header with every response, is that
something I can do in the PRE_STREAM interceptor on the OUT scope?

Arik.
On Thu, Oct 29, 2009 at 10:48 AM, Daniel Kulp <dk...@apache.org> wrote:

>  On Thu October 29 2009 1:01:20 pm Arik Gorelik wrote:
> > Hello,
> >
> > I cannot seem to find any example of how to include/set headers/values in
> > the SOAP response. Is there a CXF example on that? I can think of few
> ways
> > to do this, but was wondering if anyone has a best practice sample.
>
> See the faq:
>
> http://cxf.apache.org/faq.html
>
>
>
> --
> Daniel Kulp
> dkulp@apache.org
> http://www.dankulp.com/blog
>

Re: set headers in soap response

Posted by Daniel Kulp <dk...@apache.org>.
On Thu October 29 2009 1:01:20 pm Arik Gorelik wrote:
> Hello,
> 
> I cannot seem to find any example of how to include/set headers/values in
> the SOAP response. Is there a CXF example on that? I can think of few ways
> to do this, but was wondering if anyone has a best practice sample.

See the faq:

http://cxf.apache.org/faq.html



-- 
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog

RE: set headers in soap response

Posted by "Reddy, Rama" <ra...@ebay.com>.
You can use 


package com.xxx.xxxxx.xxxx;

import javax.annotation.Resource;
import javax.jws.WebService;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.HttpHeaders;
import javax.xml.ws.WebFault;
import javax.xml.ws.WebServiceContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.xml.ws.handler.MessageContext;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
import org.springframework.context.ApplicationContext;

@WebService(endpointInterface = "com.xxx.xxxx.xxx.Eligibility",
serviceName = "abcd/xyz")
@WebFault(targetNamespace = "http://xxxx.xxxx.xxxxx.com/", name =
"CustomFault", faultBean = "CustomFault")
public class EligibilityImpl implements Eligibility {

    static Log log = LogFactory.getLog(EligibilityImpl.class);
    ApplicationContext appContext;
	
    @Resource
    private WebServiceContext webServiceContext;

	public EligibilityResponse checkEligibility(
			EligibilityRequest parameters,
			AuthHeader authHeader) throws CustomFault {
        EligibilityResponse response = new EligibilityResponse();
        try {
                if(webServiceContext != null) {
                	try {
	                    MessageContext ctx =
webServiceContext.getMessageContext();
	                   	HttpServletRequest request =
(HttpServletRequest) ctx.get(AbstractHTTPDestination.HTTP_REQUEST);
	
requestContext.setIp(request.getRemoteAddr());
	
requestContext.setRemoteAddr(request.getRemoteAddr());
	
requestContext.setBrowser(request.getHeader(HttpHeaders.USER_AGENT)); 



>From WebServiceContext we can message context and from MessageContext..
You have access to all httpheaders.. Response headers and stuff like
that.

Thanks
Rama



-----Original Message-----
From: Arik Gorelik [mailto:arikgdev@gmail.com] 
Sent: Thursday, October 29, 2009 10:01 AM
To: users@cxf.apache.org
Subject: set headers in soap response

Hello,

I cannot seem to find any example of how to include/set headers/values
in the SOAP response. Is there a CXF example on that? I can think of few
ways to do this, but was wondering if anyone has a best practice sample.

Thank you.
Arik.