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 Sun, 02 Oct 2011 17:39:09 GMT
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