I see what you are saying.

Do you want me to log this as a bug or an issue?  I will just log the 
inconsistency of Lists as output versus input.

Thanks for your help with this.

-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]] 
Sent: Wednesday, August 24, 2011 5:36 AM
To: [email protected]
Subject: Re: Problem with WADL generation and returning a List of objects

Hi

See comments below

On Tue, Aug 23, 2011 at 10:37 PM, Timothy Paul Hanna
<[email protected]> wrote:
> Let me try to do a better job explaining.
>
> I have the following example api:
>
> @ElementClass(response=SomeObjectResponse.class)
> List<SomeObjectResponse> getSomeObjects(List<SomeObjectRequest>)
>
> The inconsistency is the ResourceUtils.getAllRequestResponseTypes does not 
> include SomeObjectResponse in the list of available JAXB elements it returns 
> (even though @XmlRootElement is declared in it).  However, it does include 
> SomeObjectRequest.  So the grammar portion of the WADL does not include the 
> SomeObjectResponse.
>
> When the WadlGenerator runs the handleRepresentation for the response portion 
> of the operation, it checks to see if the SomeObjectResponse.class declare in 
> @ElementClass is an available jaxb element (the list returned by 
> ResourceUtils.getAllRequestResponseTypes).  It is not therefore it doesn't 
> create a link from the representation back the element in the grammar.
>
> However if I were to have the following example api:
>
> @ElementClass(response=SomeObjectResponse.class)
> List<SomeObjectResponse> getSomeObjects(List<SomeObjectRequest>)
>
> @ElementClass(response=SomeObjectResponse.class)
> SomeObjectResponse getSomeObject(SomeObjectRequest)
>
> The WadlGenerator is able to connect SomeObjectResponse because the second 
> method forces it to be in the available JAXB element returned by 
> ResourceUtils.getAllRequestResponseTypes.
>
> So what I did is change the WadlGenerator.  After the 
> ResourceUtils.getAllRequestResponseTypes returns I then run through the 
> return types for the operations and if it is a List or Collection I pull out 
> the ParameterizedType.
>
> Does that make things a little more clear?  It seems to me that the 
> inconsistent behavior is in the ResourceUtils.getAllRequestResponseTypes.  It 
> handles List on inputs but not on outputs.
>

Thanks for these clarifications - I can definitely see where the
inconsistency is which needs to be fixed.
Here is what I was saying though,

you have List<SomeObjectResponse> so the actual response which will go
on the wire won't match SomeObjectResponse.
So we may be able to force a link be created to  a schema element
representing SomeObjectResponse, but it will be misleading, because
the actual response is a list of SomeObjectResponse...

Cheers, Sergey.

> -----Original Message-----
> From: Sergey Beryozkin [mailto:[email protected]]
> Sent: Tuesday, August 23, 2011 5:40 AM
> To: [email protected]
> Subject: Re: Problem with WADL generation and returning a List of objects
>
> Hi
>
> On Mon, Aug 22, 2011 at 6:43 PM, Timothy Paul Hanna
> <[email protected]> wrote:
>> It actually isn't hard to fix.  I am using the @ElementClass annotation to 
>> show that the service returns elements of that.  And your WADLGenerator 
>> already handles that.  The issue is that 
>> ResourceUtils.getAllRequestResponseTypes doesn't include the SomeObject in 
>> the list returned.  I overrode the WadlGenerator to then include the element 
>> in the list and it worked fine.  Does that help?
>>
> What exactly did work ?
> Suppose a method returns List<SomeObject> and WADLGenerator has been
> fixed to include SomeObject in the created JAXBContext.
> Now, the inclusion of SomeObject should result in the WADL grammar
> section containing a related xsd element declaration.
> Do you see a *link* from the WADL response element's (representing the
> resource method returning List<SomeObject>) representation to a schema
> element ?
>
> Cheers, Sergey
>
>
>> -----Original Message-----
>> From: Sergey Beryozkin [mailto:[email protected]]
>> Sent: Monday, August 22, 2011 3:07 AM
>> To: [email protected]
>> Subject: Re: Problem with WADL generation and returning a List of objects
>>
>> Hiin
>>
>> The reason SomeObject from List<SomeObject> is not currently checked
>> in for the purpose of
>> the WADL grammar generation is that a SomeObject schema element
>> instance can not be used to
>> describe the actual value represented by List<SomeObject>.
>>
>> For example, assuming SomeObject can be represented as
>> <SomeObject/>, List<SomeObject> (say with a single element) will be
>> represented by default as
>>  <SomeObjects><SomeObject/></SomeObjects>.
>>
>> I don't know at the moment how to get a schema element which would describe
>> <SomeObjects><SomeObject/></SomeObjects>
>>
>> generated from List<SomeObject>...SomeObjects is a default wrapper but
>> alternative names can be configured...
>>
>> Thus even if we generate a schema SomeObject element,
>> we won't be able to link to it from a given WADL response or request
>> representation which is supposed to be List<SomeObject>.
>>
>> If it's feasible then I can get it fixed, just not sure how...
>> In meantime a workaround is to use a collection bean, or configure CXF
>> WADL generator with a reference to the custom schema or even WADL
>> instance
>>
>> Cheers, Sergey
>> On Thu, Aug 18, 2011 at 9:55 PM, Daniel Kulp <[email protected]> wrote:
>>>
>>> This definitely sounds like a bug.   Can you log an issue (and maybe attach 
>>> a
>>> patch?)
>>>
>>> Thanks!
>>> Dan
>>>
>>>
>>> On Thursday, August 18, 2011 2:42:42 PM Timothy Paul Hanna wrote:
>>>> I have a service that returns a list of objects using application/xml.  The
>>>> WADL doesn't display these object in the grammar nor connects them to the
>>>> operations response.
>>>>
>>>> While debugging in CXF it seems the problem is in
>>>> ResourceUtils.getAllRequestResponseTypes The problem is the this method
>>>> doesn't include the parameterized objects in Lists on return methods.  For
>>>> example if I have the service below
>>>>
>>>> public List<SomeObject> getSomeObjects()
>>>>
>>>> SomeObject will not be included as a JAXB object even if I have
>>>> @XMLRootElement declared.  It will be included if I have any of the other
>>>> services
>>>>
>>>> public void storSomeObjects(List<SomeObject>)
>>>>
>>>> public SomeObject getSomeObject(Long id)
>>>>
>>>> If I have either of the two above methods in my service, then SomeObject
>>>> will be picked up as a JAXB object and then my WADL will display my
>>>> "getSomeObjects"definition correctly.
>>>>
>>>> This doesn't seem to be consistent. What was the intent of not handling
>>>> Lists as a return type?
>>>>
>>>> Tim
>>>>
>>>>
>>>>  NOTICE: This email message is for the sole use of the intended 
>>>> recipient(s)
>>>> and may contain confidential and privileged information. Any unauthorized
>>>> review, use, disclosure or distribution is prohibited. If you are not the
>>>> intended recipient, please contact the sender by reply email and destroy
>>>> all copies of the original message.
>>> --
>>> Daniel Kulp
>>> [email protected]
>>> http://dankulp.com/blog
>>> Talend - http://www.talend.com
>>>
>>
>>
>>
>> --
>> Sergey Beryozkin
>>
>> http://sberyozkin.blogspot.com
>> Talend - http://www.talend.com
>>
>>
>>  NOTICE: This email message is for the sole use of the intended recipient(s) 
>> and may contain confidential and privileged information. Any unauthorized 
>> review, use, disclosure or distribution is prohibited. If you are not the 
>> intended recipient, please contact the sender by reply email and destroy all 
>> copies of the original message.
>>
>>
>>
>
>
>
> --
> Sergey Beryozkin
>
> http://sberyozkin.blogspot.com
> Talend - http://www.talend.com
>



-- 
Sergey Beryozkin

http://sberyozkin.blogspot.com
Talend - http://www.talend.com

Reply via email to