Thanks, Sergay, for the hints.
I tried moving @QueryParam around and it looked like that the generated WADL
looked correct only when @QueryParam was placed on the setters.
I also tested another variation. I changed all attributes to be public and
removed all getters and setters.
public class MyParamBean {
@QueryParam("start")
public XMLGregorianCalendar start;
@QueryParam("end")
public XMLGregorianCalendar end;
@QueryParam("count")
public BigInteger count;
}
The generated WADL became
<resource path="retrieveBean"> <method name="GET"> <request/>
<response> <representation
mediaType="application/json" element="prefix1:RetrieveResponseType"/>
</response> </method></resource>
Is this also a bug?
Anyway, thanks for your help. The @BeanParam should work for me now.
Dongfeng
On Monday, May 30, 2016 3:40 PM, Sergey Beryozkin <[email protected]>
wrote:
Hi
May be WADL generator only checks annotated getters and setters, I'll
check tomorrow, though the runtime will support the annotated fields
too, please move @QueryParam to the getters and it should do it, and
I'll check if WADL generator needs to be tweaked further
Cheers, Sergey
On 30/05/16 17:37, Dongfeng Lu wrote:
> Thanks, Sergey.
>
> I did try @BeanParam, but it did not generate a correct WADL, although the
> request worked. Here is my method definition
>
> @GET
> @Path("retrieveBean")
> @Produces({ MediaType.APPLICATION_JSON })
> public RetrieveResponseType retrieve(
> @BeanParam() MyParamBean paramBean);
>
> where MyParamBean is defined as
>
>
> public class MyParamBean {
> @QueryParam("start")
> private XMLGregorianCalendar start;
>
> @QueryParam("end")
> private XMLGregorianCalendar end;
>
> @QueryParam("count")
> private BigInteger count;
>
> public XMLGregorianCalendar getStart() {
> return start;
> }
>
> public void setStart(XMLGregorianCalendar start) {
> this.start = start;
> }
>
> public XMLGregorianCalendar getEnd() {
> return end;
> }
>
> public void setEnd(XMLGregorianCalendar end) {
> this.end = end;
> }
>
> public BigInteger getCount() {
> return count;
> }
>
> public void setCount(BigInteger count) {
> this.count = count;
> }
>
> }
>
>
> The actual call in the following format actually worked,
>
>
>/retreiveBean?count=2&start=2014-02-27T21%3A11%3A00.718-06%3A00&end=2014-02-27T21%3A14%3A00.718-06%3A00
>
> But the generated WADL for this method is
> <resource path="retrieveBean">
> <method name="GET">
> <request></request>
> <response>
> <representation mediaType="application/json"
> element="prefix1:RetrieveResponseType" />
> </response>
> </method>
> </resource>
>
> I searched the user group and found discussions around ticket CXF-5989. It
> seems it had been fixed, so I was confused. Did I do something wrong?
>
> Thanks,
> Dongfeng
>
> On Monday, May 30, 2016 5:02 AM, Sergey Beryozkin <[email protected]>
>wrote:
>
>
> Hi
>
> WADLGenerator is already blocking the recursion for Date properties and
> I've just updated to block for XMlGregorianCalendar. Will work starting
> from CXF 3.1.7.
>
> Can you avoid using QueryParam("") extension and use individual
> QueryParam properties ? if you prefer the 'loose' style offered by a ""
> extension then may be you can try and achieve similar effect with JAX-RS
> 2.0 @BeanParam ?
>
> Cheers, Sergey
>
>
> On 28/05/16 23:39, Dongfeng Lu wrote:
>> I am using CXF 3.1.4.
>>
>> I searched for "queryparam" and "recursive" in the user group archive and
>> found discussions related to JIRA ticket CXF-2153. I understand its purpose,
>> but this recursiveness does not work well for certain classes like
>> javax.xml.datatype.XMLGregorianCalendar.
>>
>> I defined my data structure in XSD like
>> <xsd:complexType name="RetrieveRequestType">
>> <xsd:attribute name="start" type="xsd:dateTime"
>>use="required" />
>> <xsd:attribute name="end" type="xsd:dateTime" use="required"
>>/>
>> <xsd:attribute name="count" type="xsd:nonNegativeInteger" />
>> </xsd:complexType>
>>
>> <xsd:element name="Retrieve">
>> <xsd:complexType>
>> <xsd:complexContent>
>> <xsd:extension base="p1:RetrieveRequestType" />
>> </xsd:complexContent>
>> </xsd:complexType>
>> </xsd:element>
>>
>> In the generated Java files, "xsd:dateTime" is represented by
>> XMLGregorianCalendar class. I then defined an interface like
>> @GET
>> @Path("retrieve")
>> @Produces({ MediaType.APPLICATION_JSON })
>> public RetrieveResponseType retrieve(@QueryParam("") Retrieve
>>message) ;
>>
>> The generated WADL has the following resource definition
>> <resource path="retrieve">
>> <method name="GET">
>> <request>
>> <param name="count" style="query" />
>> <param name="end.day" style="query" type="xs:int"
>>/>
>> <param name="end.month" style="query"
>>type="xs:int" />
>> <param name="end.year" style="query"
>>type="xs:int" />
>> <param name="end.valid" style="query"
>>type="xs:boolean" />
>> <param name="end.hour" style="query"
>>type="xs:int" />
>> <param name="end.minute" style="query"
>>type="xs:int" />
>> <param name="end.second" style="query"
>>type="xs:int" />
>> <param name="end.eon" style="query" />
>> <param name="end.eonAndYear" style="query" />
>> <param name="end.fractionalSecond" style="query"
>>/>
>> <param name="end.millisecond" style="query"
>>type="xs:int" />
>> <param name="end.xMLSchemaType.namespaceURI"
>>style="query" type="xs:string" />
>> <param name="end.xMLSchemaType.prefix"
>>style="query" type="xs:string" />
>> <param name="end.xMLSchemaType.localPart"
>>style="query" type="xs:string" />
>> <param name="end.timezone" style="query"
>>type="xs:int" />
>> <param name="start.day" style="query"
>>type="xs:int" />
>> <param name="start.month" style="query"
>>type="xs:int" />
>> <param name="start.year" style="query"
>>type="xs:int" />
>> <param name="start.valid" style="query"
>>type="xs:boolean" />
>> <param name="start.hour" style="query"
>>type="xs:int" />
>> <param name="start.minute" style="query"
>>type="xs:int" />
>> <param name="start.second" style="query"
>>type="xs:int" />
>> <param name="start.eon" style="query" />
>> <param name="start.eonAndYear" style="query" />
>> <param name="start.fractionalSecond"
>>style="query" />
>> <param name="start.millisecond" style="query"
>>type="xs:int" />
>> <param name="start.xMLSchemaType.namespaceURI"
>>style="query" type="xs:string" />
>> <param name="start.xMLSchemaType.prefix"
>>style="query" type="xs:string" />
>> <param name="start.xMLSchemaType.localPart"
>>style="query" type="xs:string" />
>> <param name="start.timezone" style="query"
>>type="xs:int" />
>> </request>
>> <response>
>> <representation mediaType="application/json"
>> element="prefix1:RetrieveResponseType" />
>> </response>
>> </method>
>> </resource>
>>
>> And CXF JAXRSClientFactory.create() generated client sends the following URL
>> to the server
>>
>>
>> /retrieve?end.valid=true&end.hour=21&end.minute=14&end.second=0&end.timezone=-360&end.month=2&end.year=2014&end.day=27&end.millisecond=718&end.fractionalSecond=0.718&end.eonAndYear=2014&end.xMLSchemaType.prefix&end.xMLSchemaType.namespaceURI=http%3A//www.w3.org/2001/XMLSchema&end.xMLSchemaType.localPart=dateTime&start.valid=true&start.hour=21&start.minute=11&start.second=0&start.timezone=-360&start.month=2&start.year=2014&start.day=27&start.millisecond=718&start.fractionalSecond=0.718&start.eonAndYear=2014&start.xMLSchemaType.prefix&start.xMLSchemaType.namespaceURI=http%3A//www.w3.org/2001/XMLSchema&start.xMLSchemaType.localPart=dateTime&count=1
>>
>>
>> Clearly this is not what I wanted. I wanted simple queries like
>>
>>
>> /retrieve?start=2014-02-27T21%3A11%3A00.718-06%3A00&end=2014-02-27T21%3A14%3A00.718-06%3A00&count=1
>>
>>
>> or
>>
>>
>> /retrieve?start=1393557240718&count=2&end=1393558240718
>>
>>
>> With a customized ParamConverter for XMLGregorianCalendar both simplified
>> queries work well if I just send them directly to the server. However, the
>> WADL is still wrong, and I could not find way to have CXF client to send
>> correct URLs to the server.
>>
>> I believe this is the side effect of the fix for CXF-2153 ticket. Is there a
>> way to configure it so it only goes down one level into Retrieve class, and
>> not into its components' XMLGregorianCalendar classes?
>>
>> Thanks,Dongfeng
>>
>
>
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/