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.
Appreciate help greatly. Thanks Srini -----Original Message----- From: Sergey Beryozkin [mailto:[email protected]] Sent: Thursday, September 18, 2014 6:24 AM To: [email protected] 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 > <?xml version="1.0" encoding="UTF-8"?> <beans > 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"> > > > <bean id="someDateConverter" > class="com.my.demo.util.SomeDateConverter" /> > <bean id="paramConverterProvider" > class="com.my.demo.util.ParamConverterProviderImpl"> > <constructor-arg> > <map> > <entry key="java.util.Date" > value-ref="someDateConverter" /> > </map> > </constructor-arg> > </bean> > > <jaxrs:client id="userManagerService" > > address="http://localhost:8080/RestDemo2/services/rest/UserManager" > serviceClass="com.my.demo.rest.services.UserManager" > inheritHeaders="true"> > <jaxrs:providers> > <ref bean="paramConverterProvider" /> > </jaxrs:providers> > </jaxrs:client> > > </beans> > ////////////////////////////////////////////////////////////////////// > > //////////////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<User> 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<User> 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<User> 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<Date> { > > 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<Class<?>, ? extends ParamConverter<?>> > paramConverters; > > public ParamConverterProviderImpl( > Map<Class<?>, ? extends ParamConverter<?>> > paramConverters) { > this.paramConverters = paramConverters; > } > > @Override > public <T> ParamConverter<T> getConverter(Class<T> rawClass, > Type genericType, Annotation[] annotations) { > return (ParamConverter<T>) paramConverters.get(rawClass); > } > } > /////////////////////// > //rest-context.xml<?xml version="1.0" encoding="UTF-8"?> > <!-- <beans 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" xsi:schemaLocation=" > http://cxf.apache.org/core > http://cxf.apache.org/schemas/core.xsd > http://www.springframework.org/schema/beans > http://www.springframework.org/schema/beans/spring-beans.xsd > http://cxf.apache.org/jaxrs > http://cxf.apache.org/schemas/jaxrs.xsd > http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> --> > <beans 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" > 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"> > > <import resource="classpath:META-INF/cxf/cxf.xml" /> > <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> > > <cxf:bus> > <cxf:features> > <cxf:logging /> > </cxf:features> > </cxf:bus> > > <bean id="someDateConverter" > class="com.my.demo.util.SomeDateConverter" /> > <bean id="paramConverterProvider" > class="com.my.demo.util.ParamConverterProviderImpl"> > <constructor-arg> > <map> > <entry key="java.util.Date" > value-ref="someDateConverter" /> > </map> > </constructor-arg> > </bean> > > <bean id="userDao" > class="com.my.demo.rest.dao.impl.UserManagerMemoryDao"> > </bean> > > <bean id="userManagerService" > class="com.my.demo.rest.services.impl.UserManagerService"> > <property name="userDao" ref="userDao" /> > </bean> > > <bean id="jsonProvider" > class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" /> > > <jaxrs:server id="userManagerREST" address="/rest/UserManager"> > <jaxrs:serviceBeans> > <ref bean="userManagerService" /> > </jaxrs:serviceBeans> > <jaxrs:providers> > <ref bean='jsonProvider' /> > <ref bean="paramConverterProvider" /> > </jaxrs:providers> > </jaxrs:server> > > > </beans> > ////////////////////////////
