cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: Is there a way to control the depth of recursiveness in @QueryParam?
Date Tue, 31 May 2016 12:18:12 GMT
Hi

CXF client/server code will only check fields if property 
getters/setters are available, public fields won't be checked.
This is done to make it more effective. I doubt JAX-RS spec will ever 
enforce that public BeanParam fields need to be supported - it is a bean 
after all and the accepted patterns need to be observed.

FYI, I've just updated WADLGenerator to check BeanParam field 
annotations (with the restrictions mentioned above) and also check 
BeanParams containing embedded BeanParams

Cheers, Sergey

On 30/05/16 22:26, Dongfeng Lu wrote:
> 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 <sberyozkin@gmail.com> 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 <sberyozkin@gmail.com>
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/

Mime
View raw message