Great, it works Daniel!
Last question...in order to store the object sent in an object relative to
the current method invocation and to be accessible from the method itself,
do I must use a ThreadLocal variable? For example, now that I sent the User
object, i want to read that object only in the method call relative to the
request.

dkulp wrote:
> 
> 
> Actually, another option that I think would work is to use the unmarshal 
> method that takes the class as well:
> 
> 
> JAXBContext.newInstance(User.class).createUnmarshaller()
>       .unmarshal((Node)h.getValue(), User.class);
> 
> That tells JAXB exactly what you are trying to unmarshal.
> 
> Dan
> 
> 
> 
> On Friday 11 June 2010 10:22:25 am Daniel Kulp wrote:
>> Can you add an @XmlRootElement annotation to User?   If you add the name
>> and namespace attributes to that, I think it would be readable.
>> 
>> Dan
>> 
>> On Friday 11 June 2010 10:13:43 am Cecchi Sandrone wrote:
>> > I successfully added metadata in the soap header using the following
>> > interceptor:
>> > 
>> > public class OutputInterceptor extends AbstractSoapInterceptor {
>> > 
>> >     public OutputInterceptor() {
>> >     
>> >         super(Phase.WRITE);
>> >     
>> >     }
>> >     
>> >     public void handleMessage(SoapMessage message) throws Fault {
>> >     
>> >            SoapMessage soapMessage = (SoapMessage) message;
>> >            
>> >         List<Header> list = message.getHeaders();
>> >         
>> >         QName q = new QName("http://common.ws.model.plx.ids.it/";,
>> >         "User"); User user = new User();
>> >         user.setName("a.dionisi");
>> >         JAXBDataBinding dataBinding = null;
>> >         try {
>> >         
>> >                 dataBinding = new JAXBDataBinding(user.getClass());
>> >         
>> >         } catch (JAXBException e1) {
>> >         
>> >                 e1.printStackTrace();
>> >         
>> >         }
>> >         
>> >         SoapHeader header = new SoapHeader(q,user, dataBinding);
>> >         list.add(header);
>> >     
>> >     }
>> > 
>> > }
>> > 
>> > I checked the output SOAP message and it's correct.
>> > 
>> > Now, the problem is that I don't know how to unmarshal the User object.
>> > I tried with this input interceptor:
>> > 
>> > public class InputInterceptor extends AbstractSoapInterceptor {
>> > 
>> >    public FaultInterceptor() {
>> >    
>> >            super(Phase.UNMARSHAL);
>> >    
>> >    }
>> >    
>> >    public void handleMessage(SoapMessage message) throws Fault {
>> >    
>> >         Header h = message.getHeaders().get(1);
>> >            
>> >            try {
>> >            
>> >             JAXBElement job =
>> > 
>> >
>> (JAXBElement)JAXBContext.newInstance(User.class).createUnmarshaller().unm
>> > ar shal((Node) h.getObject());
>> > 
>> >             User u = (User)job.getValue();
>> >         
>> >         } catch (JAXBException ex) {
>> >         
>> >             //
>> >             ex.printStackTrace();
>> >         
>> >         }
>> >     
>> >     }
>> > 
>> > }
>> > 
>> > but I receive the following exception:
>> > 
>> > javax.xml.bind.UnmarshalException: unexpected element
>> > (uri:"http://common.ws.model.plx.ids.it/";, local:"User"). Expected
>> > elements are (none)
>> > 
>> > Any suggestion on how to read an object in the SoapHeader?
>> > Thanks
>> > 
>> > dkulp wrote:
>> > > On Friday 11 June 2010 7:08:18 am Cecchi Sandrone wrote:
>> > >> Hey Glen, your links are very interesting, especially the last. I'm
>> > >> following that way now...
>> > >> 
>> > >> One thing I don't understand; how can I specify that an entire
>> service
>> > >> takes also some parameters in the header? I would have the
>> possibility
>> > >> to not specify those parameters in every call. For example (PSEUDO
>> > >> CODE):
>> > >> 
>> > >> Service s = new Service();
>> > >> s.setLocale("en-US");
>> > >> 
>> > >> s.callMethod1(param1)
>> > >> s.callMethod2(param2)
>> > >> s.callMethod3(param3)
>> > >> 
>> > >> In the way you described, as I understand, every method in the
>> remote
>> > >> interface must add further parameters. For me, it would desiderable
>> to
>> > >> not
>> > >> change the existing interface because I have a great amount of
>> > >> services.
>> > > 
>> > > If you look at the FAQ:
>> > > http://cxf.apache.org/faq.html#FAQ-
>> > > HowcanIaddsoapheaderstotherequest%252Fresponse%253F
>> > > 
>> > > there are some options.     The Headers set on the request context
>> > > would be
>> > > sent for all the calls.
>> > > 
>> > > Dan
>> > > 
>> > >> Cecchi Sandrone wrote:
>> > >> > Thank you I will try one of these!
>> > >> > 
>> > >> > Glen Mazza wrote:
>> > >> >> Sure, with JAX-WS Handlers--take a look at the SOAPHandler.java
>> in
>> > >> 
>> > >> Step
>> > >> 
>> > >> >> #5 here:
>> http://www.jroller.com/gmazza/entry/jaxws_handler_tutorial
>> > >> >> . CXF interceptors are another option, check
>> > >> >> ClientInterceptors.java here:
>> > >> >>
>> http://www.jroller.com/gmazza/entry/jaxwshandlers_to_cxfinterceptor
>> > >> >> s.
>> > >> >> 
>> > >> >> In either case, you'll most probably want to add these elements
>> to
>> > >> >> the soap header, not the soap body.
>> > >> >> 
>> > >> >> Finally, if you're allowed to do WSDL modification, you can add
>> the
>> > >> >> metadata as implicit SOAP headers which will give you an actual
>> > >> >> parameter in your SOAP calls to add this data:
>> > >> >>
>> http://www.jroller.com/gmazza/entry/using_implicit_soap_headers_wit
>> > >> >> h.
>> > >> >> 
>> > >> >> HTH,
>> > >> >> Glen
>> > >> >> 
>> > >> >> Cecchi Sandrone wrote:
>> > >> >>> I was wondering if it's possible to add some metadata to a
>> > >> >>> WebService call. In my case this can be useful to send the
>> client
>> > >> >>> locale; this
>> > >> 
>> > >> can
>> > >> 
>> > >> >>> be very useful to translate error messages or other strings in
>> the
>> > >> >>> server side. Is it possible to do?
> 
> -- 
> Daniel Kulp
> [email protected]
> http://dankulp.com/blog
> 
> 

-- 
View this message in context: 
http://old.nabble.com/Add-metadata-to-a-service-call-tp28831515p28856473.html
Sent from the cxf-user mailing list archive at Nabble.com.

Reply via email to