cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Kiren Pillay <kirenpill...@gmail.com>
Subject Re: Marshalling REST Query Parameter directly into Integer Array
Date Tue, 04 Oct 2011 08:33:36 GMT
Thanks Sergei, I was on the wrong track, but thanks to your testcase I
can see now that I should pass in array variables as:
http://localhost:8080/testMyRest/time?index=1&index=2&index=3

and I was trying to achieve this kind of request (more human/tester friendly)
http://localhost:8080/testMyRest/time?index=1,2,3

Regards
Kiren
On Mon, Oct 3, 2011 at 5:11 PM, Sergey Beryozkin <sberyozkin@gmail.com> wrote:
> That works exactly the way I described :-), but you can easily double-check
> it by havubg a breakpoint in
> org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter and you can see what
> happens by running most of JAXRSUtilsTest, testCustomerParameter is one of
> them
> Sergey
>
> On 03/10/11 15:25, Kiren Pillay wrote:
>>
>> Okay, can you send me the name of a test case in the code where I can
>> see how this works please?
>>
>> Regards
>> Kiren
>>
>>
>> On Mon, Oct 3, 2011 at 10:35 AM, Sergey Beryozkin<sberyozkin@gmail.com>
>>  wrote:
>>>
>>> Hi
>>>
>>> When we have List<SomeType>, it is the runtime that manages the
>>> instantiation of List and it would look for ParameterHandler<SomeType>
>>> only if SomeType does not have a suitable constructor or factory method.
>>> It
>>> will also be checked as a last resort if SomeType(String) constructor
>>> throws
>>> an exception, ex, Date(String) is problematic...
>>>
>>> Cheers, Sergey
>>>
>>> On 02/10/11 18:39, Kiren Pillay wrote:
>>>>
>>>> Hi Sergey,
>>>>
>>>> Apologies, I didn't test my app correctly. It looks like the
>>>> ParameterHandler isn't working as it should.
>>>>
>>>> When I use a parameter of 1 for example, then it works. If I use a
>>>> comma-separated list ("1,2,3") it fails saying:
>>>> "02 Oct 2011 7:19:18 PM org.apache.cxf.jaxrs.utils.InjectionUtils
>>>> handleParameter
>>>> SEVERE: Class java.lang.Integer can not be instantiated using a
>>>> constructor with a single String argument"
>>>>
>>>> When debugging, I notice that my custom ParameterHandler is not hit,
>>>> maybe my ParameterHandler is not registered correctly?
>>>>
>>>> Here's my bean config snippet:
>>>> --
>>>>
>>>> <import resource="classpath:META-INF/cxf/cxf.xml"/>
>>>>     <context:component-scan base-package="za.co.kiren"/>
>>>>
>>>>     <bean id="integerListParameterHandler"
>>>> class="za.co.vodacom.pams.core.common.cxf.IntegerListParameterHandler"
>>>> />
>>>>
>>>>
>>>>     <jaxrs:server id="restContainer" address="/">
>>>>         <jaxrs:serviceBeans>
>>>>             <ref bean="timeService"/>
>>>>         </jaxrs:serviceBeans>
>>>>          <jaxrs:providers>
>>>>         <ref bean="integerListParameterHandler" />
>>>>
>>>>          </jaxrs:providers>
>>>>     </jaxrs:server>
>>>> </beans>
>>>>
>>>>
>>>> Class:
>>>>
>>>> package za.co.kiren.testMyRest;
>>>>
>>>> import org.springframework.format.datetime.DateFormatter;
>>>> import org.springframework.stereotype.Component;
>>>> import org.springframework.stereotype.Service;
>>>>
>>>> import java.util.Calendar;
>>>> import java.util.List;
>>>> import java.util.Locale;
>>>>
>>>> import javax.ws.rs.GET;
>>>> import javax.ws.rs.Path;
>>>> import javax.ws.rs.Produces;
>>>> import javax.ws.rs.QueryParam;
>>>>
>>>> @Component
>>>> @Service("timeService")
>>>> public class TimeService {
>>>>        @GET
>>>>        @Produces("text/plain")
>>>>        @Path("/time")
>>>>        public String getDateTime(@QueryParam("index") List<Integer>
>>>>  list)
>>>> {
>>>>                String tmp = list.toString();
>>>>                /*
>>>>                 * for (Integer integer : list) { tmp+=":"+integer;
}
>>>>                 */
>>>>
>>>>                DateFormatter formatter = new DateFormatter("dd/MM/yyyy
>>>> hh:mm:ss");
>>>>
>>>>                return tmp
>>>>                                +
>>>> formatter.print(Calendar.getInstance().getTime(),
>>>>                                                Locale.getDefault());
>>>>        }
>>>> }
>>>>
>>>>
>>>> On Fri, Sep 30, 2011 at 4:47 PM, Kiren Pillay<kirenpillay1@gmail.com>
>>>>  wrote:
>>>>>
>>>>> Hi Sergery,
>>>>>
>>>>> List<Integer>    works well, thanks for your help:)
>>>>>
>>>>> Moved to 2.4.2 also.
>>>>>
>>>>> Regards
>>>>> Kiren
>>>>>
>>>>> On Thu, Sep 29, 2011 at 2:33 PM, Sergey Beryozkin<sberyozkin@gmail.com>
>>>>>  wrote:
>>>>>>
>>>>>> Hi
>>>>>>
>>>>>> There was a minor issue to do with handling arrays such as Integer[],
>>>>>> but I
>>>>>> can see no problems with List<Integer>. I committed a test
involving
>>>>>> List<Integer>    &    Integer[].
>>>>>> Not sure why you see a problem with List<Integer>
>>>>>> Can you try 2.4.2 please ?
>>>>>> Sergey
>>>>>>
>>>>>> On 28/09/11 17:34, Kiren Pillay wrote:
>>>>>>>
>>>>>>> Hi Sergey!
>>>>>>>
>>>>>>> Tried int[], got the same error.
>>>>>>>
>>>>>>> <detail>[I cannot be cast to [Ljava.lang.Object;
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> org.apache.cxf.jaxrs.utils.InjectionUtils.addToCollectionValues(InjectionUtils.java:752)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> org.apache.cxf.jaxrs.utils.InjectionUtils.injectIntoCollectionOrArray(InjectionUtils.java:740)
>>>>>>>
>>>>>>>
>>>>>>> I also tried List<Integer>      but that also failed
with the same
>>>>>>> error.
>>>>>>>
>>>>>>> Is there anything special with the provider configuration maybe?
>>>>>>> (using
>>>>>>> 2.4.1).
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Wed, Sep 28, 2011 at 5:41 PM, Sergey
>>>>>>> Beryozkin<sberyozkin@gmail.com>
>>>>>>>  wrote:
>>>>>>>>
>>>>>>>> Hi
>>>>>>>>
>>>>>>>> List<Integer>      must be supported, I'll add a
test for Integer[],
>>>>>>>> have you
>>>>>>>> tried int[] ?
>>>>>>>>
>>>>>>>> Cheers, Sergey
>>>>>>>>
>>>>>>>> On 28/09/11 15:42, Kiren Pillay wrote:
>>>>>>>>>
>>>>>>>>> Hi
>>>>>>>>>
>>>>>>>>> This is an old problem, but I can't seem to find a solution
posted
>>>>>>>>> anywhere. I want to marshall a comma-separated list of
integers
>>>>>>>>> directly into an Integer [].
>>>>>>>>>
>>>>>>>>>  1. Service:
>>>>>>>>>
>>>>>>>>>   public Response getCounters(
>>>>>>>>>             @QueryParam("msisdn") Long msisdn,
>>>>>>>>>             @QueryParam("counters") Integer []
counters,
>>>>>>>>>             @QueryParam("subscriberIdType") String
>>>>>>>>> subscriberIdType)
>>>>>>>>>
>>>>>>>>> 2. I've written a ParameterHandler for this :
>>>>>>>>>
>>>>>>>>> public class IntegerArrayParameterHandler implements
>>>>>>>>>                ParameterHandler<Integer[]>
       {
>>>>>>>>>        @Override
>>>>>>>>>        public Integer[] fromString(String arg0) {
>>>>>>>>>
>>>>>>>>> 3. The parameter handler is registered, however its not
picked up
>>>>>>>>> when
>>>>>>>>> I do the query:
>>>>>>>>>
>>>>>>>>>  <detail>[I cannot be cast to [Ljava.lang.Object;
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.cxf.jaxrs.utils.InjectionUtils.addToCollectionValues(InjectionUtils.java:752)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.cxf.jaxrs.utils.InjectionUtils.injectIntoCollectionOrArray(InjectionUtils.java:740)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.cxf.jaxrs.utils.InjectionUtils.createParameterObject(InjectionUtils.java:807)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.cxf.jaxrs.utils.JAXRSUtils.readQueryString(JAXRSUtils.java:947)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> org.apache.cxf.jaxrs.utils.JAXRSUtils.createHttpParameterValue(JAXRSUtils.java:649)
>>>>>>>>>
>>>>>>>>> Is there a way to get this to work?
>>>>>>>>>
>>>>>>>>> 4. I've Registered the Provider:
>>>>>>>>>                       ----
>>>>>>>>>                        <ref bean="integerArrayParameterHandler"
/>
>>>>>>>>>                </jaxrs:providers>
>>>>>>>>>
>>>>>>>>> The easiest solution is to just use the String value
and parse it
>>>>>>>>> inside my code,( which is probably why there are not
many posts on
>>>>>>>>> this:).
>>>>>>>>>
>>>>>>>>> Regards
>>>>>>>>> Kiren
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>
>>>
>
>

Mime
View raw message