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

Reply via email to