Return-Path: X-Original-To: apmail-cxf-users-archive@www.apache.org Delivered-To: apmail-cxf-users-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 7E87B11397 for ; Thu, 18 Sep 2014 10:37:04 +0000 (UTC) Received: (qmail 63711 invoked by uid 500); 18 Sep 2014 10:37:03 -0000 Delivered-To: apmail-cxf-users-archive@cxf.apache.org Received: (qmail 63645 invoked by uid 500); 18 Sep 2014 10:37:03 -0000 Mailing-List: contact users-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: users@cxf.apache.org Delivered-To: mailing list users@cxf.apache.org Received: (qmail 63633 invoked by uid 99); 18 Sep 2014 10:37:03 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 18 Sep 2014 10:37:03 +0000 X-ASF-Spam-Status: No, hits=-0.7 required=5.0 tests=RCVD_IN_DNSWL_LOW,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of sberyozkin@gmail.com designates 74.125.82.44 as permitted sender) Received: from [74.125.82.44] (HELO mail-wg0-f44.google.com) (74.125.82.44) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 18 Sep 2014 10:36:35 +0000 Received: by mail-wg0-f44.google.com with SMTP id b13so653670wgh.3 for ; Thu, 18 Sep 2014 03:36:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type:content-transfer-encoding; bh=+ccLdOJ539ILULaVw0KVsZBovrmIPTv4G19myiyvZ3k=; b=tF4Tl5o/Xd0qmsm+rW8RKp63Qo1ySwXTQsMik720wPhr64ldyd5V6ad0CYvvuj0PgT oIHalXonQs/ZhZSvpfKUywa8xyTFtGp/A7lPnwrfnU50bhzMxWDwmi5vwFt29Zkrl8xa zggBmMUqjqmfxTI8gJk1A15/+ER97qpwWPJJ71kfCa6zwdmT+WubiVp9Shkn3gYLWBVy Rp8P0NZcSaq6KL/7m35/xdh70o1cy/3yPWywJnF/vOE4rBwUTY3n3fyMyhpwsdOHwRiK Ql4GMcnymlCIE/DEKM8GnNHyitz4WdxS4vtGM9F4uKdH3ON5l+DLL6DfyEYZSIVMUgBd xCTQ== X-Received: by 10.181.23.196 with SMTP id ic4mr34600289wid.69.1411036595131; Thu, 18 Sep 2014 03:36:35 -0700 (PDT) Received: from [10.36.226.2] ([80.169.137.63]) by mx.google.com with ESMTPSA id ka3sm25513188wjc.3.2014.09.18.03.36.34 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Sep 2014 03:36:34 -0700 (PDT) Message-ID: <541AB5B1.7020801@gmail.com> Date: Thu, 18 Sep 2014 11:36:33 +0100 From: Sergey Beryozkin User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.1.1 MIME-Version: 1.0 To: users@cxf.apache.org Subject: Re: Help- Client invocation with PathParam does not call ccustom ParameterConverter for JAX_RS service using cxf-3.0.2-SNAPSHOT References: <8036DF2430E7FC4CA2CA2A12B6A6AC7256D8D69C8B@SUSDAY230MBX.corp.ncr.com> <541AB2C8.3030504@gmail.com> <8036DF2430E7FC4CA2CA2A12B6A6AC7256D8D69CA2@SUSDAY230MBX.corp.ncr.com> In-Reply-To: <8036DF2430E7FC4CA2CA2A12B6A6AC7256D8D69CA2@SUSDAY230MBX.corp.ncr.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org Hi On 18/09/14 11:30, Nagulapalli, Srinivas wrote: > > Hi > Yes, the converter is registered on server too- in "rest-context.xml" (way bottom) below. On client side "rest-client.xml" used to register the converter. > Right, may be a bit of extra code is pasted here :-), not easy to see the relevant bits... You have GetUserByDateRangeRequest2 but expect a Date converter be called so of course that won't work. Cheers, Sergey > Appreciate help greatly. > > Thanks > Srini > > -----Original Message----- > From: Sergey Beryozkin [mailto:sberyozkin@gmail.com] > Sent: Thursday, September 18, 2014 6:24 AM > To: users@cxf.apache.org > Cc: Nagulapalli, Srinivas > Subject: Re: Help- Client invocation with PathParam does not call ccustom ParameterConverter for JAX_RS service using cxf-3.0.2-SNAPSHOT > > Hi > > Please send the queries to the users list instead, > > Comments below, > On 18/09/14 11:15, Nagulapalli, Srinivas wrote: >> Hi >> When calling a service using PathParam with an object containing java.util.Date, the custom ParamConverter is NOT getting invoked. >> That is, getUserByDateRange2(GetUserByDateRangeRequest2 request) does NOT call SomeDateConverter in code below. >> Instead gives following error on Server.log; >> -------------------------------------------------------------------- >> Payload: Parameter Class >> com.my.demo.rest.services.GetUserByDateRangeRequest2 has no >> constructor with single String parameter, static valueOf(String) or >> fromString(String) methods >> -------------------------------------------------------------------- >> > This is a server side error message, not the client side one. > Do you have the converter registered on the server too ? > > Cheers, Sergey > > >> However, it is correctly getting invoked when using MatrixParam. That is, getUserByDateRange(GetUserByDateRange request) calls SomeDateConverter as expected. >> >> Code tested using Apache CXF 3.0.2-SNAPSHOT (because it has fix for >> the needed Date marshalling) >> >> Am I missing something? >> >> Appreciate greatly any help/pointers. >> >> Thanks >> Srini >> >> ////////////////////////////////////////////////////////////////////// >> //// >> >> /////Client Side: >> public class UserManagerServiceTest { >> public static void main(String[] args) { >> ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext (new String[]{"rest-client.xml"}); >> UserManager userManagerService = (UserManager) >> appContext.getBean("userManagerService"); >> >> Date startDate = new DateTime(1960, 1, 1, 0, 0).toDate(); >> Date endDate = new DateTime(1982, 1, 1, 0, >> 0).toDate(); >> >> GetUserByDateRangeRequest request = new GetUserByDateRangeRequest(startDate, endDate); >> String s2 = >> userManagerService.getUserByDateRange3(request); //This invokes >> SomeDateConverter- WORKS:-) >> >> GetUserByDateRangeRequest2 request2 = new GetUserByDateRangeRequest2(startDate); >> String pathParamResult = userManagerService.getUserByDateRange2(request2); //This does NOT invoke SomeDateConverter!!! >> >> appContext.close(); >> >> } >> } >> ////////////////////////////////////////////// >> ///rest-client.xml >> > xmlns="http://www.springframework.org/schema/beans" >> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://cxf.apache.org/core" >> xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:jaxrs="http://cxf.apache.org/jaxrs-client" >> xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd >> http://cxf.apache.org/jaxrs-client http://cxf.apache.org/schemas/jaxrs-client.xsd >> http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd >> http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd >> http://cxf.apache.org/jaxrs >> http://cxf.apache.org/schemas/jaxrs.xsd"> >> >> >> >> >> >> >> >> >> >> >> >> > address="http://localhost:8080/RestDemo2/services/rest/UserManager" >> serviceClass="com.my.demo.rest.services.UserManager" >> inheritHeaders="true"> >> >> >> >> >> >> >> ////////////////////////////////////////////////////////////////////// >> >> //////////////Server side code below >> //UserManager.java >> package com.my.demo.rest.services; >> >> import java.util.Date; >> >> import javax.jws.WebParam; >> import javax.ws.rs.Consumes; >> import javax.ws.rs.GET; >> import javax.ws.rs.MatrixParam; >> import javax.ws.rs.POST; >> import javax.ws.rs.Path; >> import javax.ws.rs.PathParam; >> import javax.ws.rs.Produces; >> import javax.ws.rs.QueryParam; >> import javax.ws.rs.core.MediaType; >> >> import com.my.demo.rest.model.UserRequest; >> import com.my.demo.rest.model.UserResponse; >> >> @Consumes("application/json") >> @Produces("application/json") >> public interface UserManager >> { >> @GET >> @Path("/getUserByDateRange") >> @Produces(MediaType.TEXT_PLAIN) >> public String getUserByDateRange(@MatrixParam("") >> @WebParam(name = "request") GetUserByDateRangeRequest request); >> >> >> @GET >> @Path("/getUserByDateRange2/{request}") >> @Produces(MediaType.TEXT_PLAIN) >> public String getUserByDateRange2(@PathParam("request") >> @WebParam(name = "request")GetUserByDateRangeRequest2 request); >> >> >> @GET >> @Path("/getUserByDateRange3") >> @Produces(MediaType.TEXT_PLAIN) >> public String getUserByDateRange3(@QueryParam("") >> @WebParam(name = "request") GetUserByDateRangeRequest request); >> >> } >> //==================================================================== >> ================== >> //UserManagerService.java >> package com.my.demo.rest.services.impl; >> >> import java.util.Date; >> import java.util.List; >> >> import javax.xml.ws.Endpoint; >> >> import com.my.demo.rest.dao.UserManagerDao; >> import com.my.demo.rest.model.User; >> import com.my.demo.rest.model.UserRequest; >> import com.my.demo.rest.model.UserResponse; >> import com.my.demo.rest.services.GetUserByDateRangeRequest; >> import com.my.demo.rest.services.GetUserByDateRangeRequest2; >> import com.my.demo.rest.services.UserManager; >> >> public class UserManagerService implements UserManager { >> private UserManagerDao userDao; >> >> public UserManagerDao getUserDao() >> { >> return userDao; >> } >> >> public void setUserDao(UserManagerDao userDao) >> { >> this.userDao = userDao; >> } >> >> public String getUserByDateRange(GetUserByDateRangeRequest request) >> { >> String response = new String(); >> >> StringBuffer buf = new StringBuffer(); >> Date startDate = request.getStartDate(); >> Date endDate = request.getEndDate(); >> try >> { >> List listUsers = getUserDao().fetchUserByDateRange(startDate, endDate); >> for (User user: listUsers){ >> buf.append("User:" + user); >> buf.append("\n"); >> } >> return buf.toString(); >> } >> catch (Exception e) >> { >> response = "Error:"+ e.getClass() + ": " + e.getMessage(); >> } >> >> return response; >> } >> >> public String getUserByDateRange3(GetUserByDateRangeRequest request) >> { >> String response = new String(); >> >> StringBuffer buf = new StringBuffer(); >> Date startDate = request.getStartDate(); >> Date endDate = request.getEndDate(); >> try >> { >> List listUsers = getUserDao().fetchUserByDateRange(startDate, endDate); >> for (User user: listUsers){ >> buf.append("User:" + user); >> buf.append("\n"); >> } >> return buf.toString(); >> } >> catch (Exception e) >> { >> response = "Error:"+ e.getClass() + ": " + e.getMessage(); >> } >> >> return response; >> } >> >> >> public String getUserByDateRange2(GetUserByDateRangeRequest2 request) >> { >> String response = new String(); >> >> StringBuffer buf = new StringBuffer(); >> Date startDate = request.getStartDate(); >> Date endDate = new Date(); >> try >> { >> List listUsers = getUserDao().fetchUserByDateRange(startDate, endDate); >> for (User user: listUsers){ >> buf.append("User:" + user); >> buf.append("\n"); >> } >> return buf.toString(); >> } >> catch (Exception e) >> { >> response = "Error:"+ e.getClass() + ": " + e.getMessage(); >> } >> >> return response; >> } >> } >> /////////////////////////////////////// >> //SomeDateConverter.javapackage com.my.demo.util; >> >> import java.util.Date; >> >> import javax.ws.rs.ext.ParamConverter; >> >> import org.joda.time.DateTime; >> import org.joda.time.DateTimeZone; >> import org.joda.time.format.ISODateTimeFormat; >> import org.slf4j.Logger; >> import org.slf4j.LoggerFactory; >> >> public class SomeDateConverter implements ParamConverter { >> >> Logger logger = LoggerFactory.getLogger(SomeDateConverter.class); >> @Override >> public Date fromString(String dateString) { >> logger.info("***Entered fromString() - dateString=" + >> dateString); >> >> if (dateString.contains("-")) { >> DateTime result = ISODateTimeFormat.dateTimeParser() >> .withZone(DateTimeZone.UTC).parseDateTime(dateString); >> return result.toDate(); >> } >> return new Date(Long.parseLong(dateString)); >> } >> >> @Override >> public String toString(Date dateToConvert) { >> logger.info("***Entered SomeDateConverter - toString() dateToConvert=" + dateToConvert); >> return ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC) >> .print(dateToConvert.getTime()); >> } >> >> public static void main(String[] args) { >> SomeDateConverter sdc = new SomeDateConverter(); >> >> String s = "1960-01-01T05:00:00.000Z"; >> /*String s = "Thu Dec 31 19:00:00 EST 1959"; */ >> Date d = sdc.fromString(s); >> System.out.println("For s=" + s + "; date converted >> is:" + d); >> >> >> //Date now = new Date(); >> //System.out.println("Date(now)=" + now + "; in ISO >> format toDate()=" + sdc.toString(now)); >> >> } >> } >> /////////////// >> //ParamConverterProviderImpl.java >> package com.my.demo.util; >> >> import java.lang.annotation.Annotation; import java.lang.reflect.Type; >> import java.util.Map; import javax.ws.rs.ext.ParamConverter; import >> javax.ws.rs.ext.ParamConverterProvider; >> >> public class ParamConverterProviderImpl implements ParamConverterProvider { >> private final Map, ? extends ParamConverter> >> paramConverters; >> >> public ParamConverterProviderImpl( >> Map, ? extends ParamConverter> paramConverters) { >> this.paramConverters = paramConverters; >> } >> >> @Override >> public ParamConverter getConverter(Class rawClass, >> Type genericType, Annotation[] annotations) { >> return (ParamConverter) paramConverters.get(rawClass); >> } >> } >> /////////////////////// >> //rest-context.xml >> > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://cxf.apache.org/core" >> xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:jaxrs="http://cxf.apache.org/jaxrs" >> xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd >> http://cxf.apache.org/jaxrs-client http://cxf.apache.org/schemas/jaxrs-client.xsd >> http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd >> http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd >> http://cxf.apache.org/jaxrs >> http://cxf.apache.org/schemas/jaxrs.xsd"> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> > class="com.my.demo.rest.dao.impl.UserManagerMemoryDao"> >> >> >> > class="com.my.demo.rest.services.impl.UserManagerService"> >> >> >> >> > class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" /> >> >> >> >> >> >> >> >> >> >> >> >> >> >> //////////////////////////// > -- Sergey Beryozkin Talend Community Coders http://coders.talend.com/ Blog: http://sberyozkin.blogspot.com