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.

Reply via email to