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<sberyoz...@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<kirenpill...@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<sberyoz...@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<sberyoz...@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








Reply via email to