Hi Sergey: I have this issue too. --- If an object class has no @XmlRootElement but its name is a key in this map then JAXBElement will be created internally and serialized properly --- It is very useful, can you tell me which version we can get it?
Sergey Beryozkin wrote: > > I have just updated JAXBElementProvider to properly wrap into JAXBElements > those JAXB-generated types > which are missing for whatever reasons @XmlRootElement annotations. > > 'jaxbElementClassNames' list property I referred to earlier can only be > used with classes which do have @XmlRootElement annotations, it is really > only useful if the serialization of the derived types needs to be > affected. > > I've added a similar jaxbElementClassMap property which contains className > to element name pairs, with element names being either simple names or > expanded qnames. > If an object class has no @XmlRootElement but its name is a key in this > map then JAXBElement will be created internally and serialized properly. > > I think it can be quite useful in a number of cases. > > Scott - if you need this feature right now then let me know please and I > can help you to create a custom JAXBElementProvider which will do it for > you, till the fix makes it into the next 2.2.x release. > > thanks, Sergey > > Sergey Beryozkin-2 wrote: >> >> Hi >> >> Returning JAXBElement<Book> will work in JAX-RS as it is required by the >> spec, provided it's possible for a user to have explicit JAXBElements in >> method signatures (for ex, return types). >> >> JAX-RS JAXBElementProvider can actually be told to wrap a given object in >> a JAXBElement, but so far this option (setting a 'jaxbElementClassNames' >> list property containing class names) has only been used to affect the >> serialization of derived types, for an xsi:type attribute be added. I >> tried that option to wrap the objects of types with no @XmlRootElement >> hoping it would work but unfortunately it did not, still @XmlRootElement >> was needed. I'll give it another try though... >> >>> I suppose we could allow @XmlElement on the method for the return, but >>> until we go JAXB 2.2 ... >> >> Interesting, it will be definitely worth investigating >> >> cheers, Sergey >> >> >> >> -----Original Message----- >> From: Daniel Kulp [mailto:[email protected]] >> Sent: Wed 8/5/2009 11:42 AM >> To: [email protected] >> Cc: Sergey Beryozkin >> Subject: Re: @XmlRootElement with jax-rs/jax-ws >> >> >> There may be a couple of options worth investigating. I'm not familiar >> enough with the way JAXB works with JAX-RS to really say whether this >> will >> work or not: >> >> 1) Return JAXBElement<Book>, not just Book. With jaxb, when >> marshalling, you >> either have to hand it a class with an XmlRootElement annotation or you >> need >> to hand it a JAXBElement. This should make it go the second route. >> >> 2) To make (1) more explicit, when you run xjc, there IS a jaxb >> customization >> to have it actually generate a class for each root element. I think its >> <jaxb:globalBindings generateElementClass="true"/> >> >> With JAX-WS in "Bare" mode, we wouldn't create wrapper classes. >> However, in >> that case, we have the @WebResult annotation to help us define the >> element >> name to use. Thus, the runtime will create a JAXBElement with the QName >> created from the @WebResult and set the value of the JAXBElement to the >> "Book" >> and feed it to the JAXB runtime. That's how it works with JAXWS. For >> JAX- >> RS, I'm not sure there is really any place to record the namespace/name >> for >> the wrapper element to use as an annotation. I suppose we could allow >> @XmlElement on the method for the return, but until we go JAXB 2.2 which >> would >> allow it on the params as well, there wouldn't be anything we can do for >> the >> incoming side (or the outgoing side for the client stuff). >> >> >> Dan >> >> >> On Wed August 5 2009 4:39:59 am Sergey Beryozkin wrote: >>> Hi, >>> >>> AFAIK, in case of JAXWS, additional JAXB elements/classes are generated. >>> For ex, if it's a method called 'getBook' returning Book then it will be >>> a >>> getBookResponse class that will be generated. >>> >>> I was also assuming that if ObjectFactory had methods returning >>> JAXBElements then there'd be no need in updating the generated classes >>> with >>> @XmlRootElement which apparently is not the case. >>> >>> I don't think that in case of JAX-RS we can generate wrappers too. >>> Dan - is there anything that can be done at a pure JAXB level for users >>> to >>> avoid explicitly adding XMLRootElement ? It appears there's no solution >>> really... >>> >>> thanks, Sergey >>> >>> Scott Oster-2 wrote: >>> > I am trying to add jax-rs annotations to an existing service >>> > implementation >>> > generated by wsdltojava (wrapped style). The POJO returned by my >>> > operation >>> > is defined in a standalone XSD, and understandably doesn¹t have the >>> > @XmlRootElement annotation (for the reasons described here >>> > >>> http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html >>> >). >>> > >>> > My web service works fine, but my REST call dies with the error: >>> > unable to marshal type "..." as an element because it is missing an >>> > @XmlRootElement annotation >>> > >>> > If I add the @XmlRootElement annotation to the POJO, it works fine, >>> but >>> > from >>> > the documentation it seems I shouldn¹t have to do this (and I don¹t >>> want >>> > to, >>> > as it is generated code). >>> > >>> > In reading this bug: http://issues.apache.org/jira/browse/CXF-1650 >>> > It appears this was an issue and should be ³fixed² in the version I am >>> > using >>> > (2.2 and trunk) but it¹s not clear if I am expected to configure >>> > something. >>> > >>> > The documentation here: >>> > http://cwiki.apache.org/CXF20DOC/jax-rs.html#JAX-RS-JAXBsupport >>> states: >>> > ³Alternatively to using @XmlRootElement and Collection wrappers, one >>> can >>> > provide an Object factory which will tell JAXB how to >>> > marshal a given type (in case of Collections - its template type).² >>> > >>> > I have an ObjectFactory, generated by wsdl2java (and it looks >>> correct), >>> > but >>> > I¹m not sure how I am supposed to ³provide² it other than have it on >>> the >>> > classpath (as I do). Could you expand upon what exactly one needs to >>> do >>> > to >>> > get this to work? >>> > >>> > Thanks, >>> > Scott >>> > >>> > Scott Oster >>> > >>> > Co-Director >>> > Software Research Institute >>> > Center for IT Innovations in Healthcare >>> > >>> > Senior Researcher >>> > Department of Biomedical Informatics >>> > >>> > The Ohio State University >>> > Phone: (614) 293-9590 >> >> -- >> Daniel Kulp >> [email protected] >> http://www.dankulp.com/blog >> >> >> > > -- View this message in context: http://www.nabble.com/%40XmlRootElement-with-jax-rs-jax-ws-tp24795823p24896733.html Sent from the cxf-user mailing list archive at Nabble.com.
