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/


  

Reply via email to