|
View:
New views
12 Messages
—
Rating Filter:
Alert me
|
|
|
set headers in soap responseHello,
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 responseYou 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@...] Sent: Thursday, October 29, 2009 10:01 AM To: users@... 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. |
|
|
Re: set headers in soap responseOn 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@... http://www.dankulp.com/blog |
|
|
Re: set headers in soap responseSeems 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@...> 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@... > http://www.dankulp.com/blog > |
|
|
Re: set headers in soap responseBasically, 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 <arikgdev@...> 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@...> 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@... >> http://www.dankulp.com/blog >> > > |
|
|
Re: set headers in soap responseOn 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@...> 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@...> 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@... > >> http://www.dankulp.com/blog > -- Daniel Kulp dkulp@... http://www.dankulp.com/blog |
|
|
Re: set headers in soap responseGreat. 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 <dkulp@...> 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@...> > 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@...> > 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@... > > >> http://www.dankulp.com/blog > > > > -- > Daniel Kulp > dkulp@... > http://www.dankulp.com/blog > |
|
|
Re: set headers in soap responseIf 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 <dkulp@...> 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@...> > > > > 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@...> > > > > 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@... > > > >> http://www.dankulp.com/blog > > > > -- > > Daniel Kulp > > dkulp@... > > http://www.dankulp.com/blog > -- Daniel Kulp dkulp@... http://www.dankulp.com/blog |
|
|
Re: set headers in soap responseThat'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 <dkulp@...> 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 <dkulp@...> 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@...> > > > > > > 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@...> > > > > > > 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@... > > > > >> http://www.dankulp.com/blog > > > > > > -- > > > Daniel Kulp > > > dkulp@... > > > http://www.dankulp.com/blog > > > > -- > Daniel Kulp > dkulp@... > http://www.dankulp.com/blog > |
|
|
Re: set headers in soap responseI 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 <arikgdev@...> 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 <dkulp@...> 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 <dkulp@...> 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@...> >> > > >> > > 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@... >> > >> > > >> > > 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@... >> > > > >> http://www.dankulp.com/blog >> > > >> > > -- >> > > Daniel Kulp >> > > dkulp@... >> > > http://www.dankulp.com/blog >> > >> >> -- >> Daniel Kulp >> dkulp@... >> http://www.dankulp.com/blog >> > > |
|
|
Re: set headers in soap responseIs 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 <arikgdev@...> 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 <arikgdev@...> 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 <dkulp@...> 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 <dkulp@...> 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@...> >>> > > >>> > > 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@...> >>> > > >>> > > 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@... >>> > > > >> http://www.dankulp.com/blog >>> > > >>> > > -- >>> > > Daniel Kulp >>> > > dkulp@... >>> > > http://www.dankulp.com/blog >>> > >>> >>> -- >>> Daniel Kulp >>> dkulp@... >>> http://www.dankulp.com/blog >>> >> >> > |
|
|
Re: set headers in soap responseI 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 <arikgdev@...> 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 <arikgdev@...>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 <arikgdev@...>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 <dkulp@...> 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 <dkulp@...> >>>> 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@... >>>> > >>>> > > >>>> > > 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@...> >>>> > > >>>> > > 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@... >>>> > > > >> http://www.dankulp.com/blog >>>> > > >>>> > > -- >>>> > > Daniel Kulp >>>> > > dkulp@... >>>> > > http://www.dankulp.com/blog >>>> > >>>> >>>> -- >>>> Daniel Kulp >>>> dkulp@... >>>> http://www.dankulp.com/blog >>>> >>> >>> >> > |
| Free embeddable forum powered by Nabble | Forum Help |