[Resending attaching with code this time for easy reference- Thanks]
> -----Original Message-----
> From: Sergey Beryozkin [mailto:[email protected]]
> 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.
Please tell, what should be done to make Date converter to be called when using
PathParam passing an object containing a java.util.Date object.
Of course, when using MatrixParam, passing GetUserByDateRangeRequest object,
custom ParamConverter SomeDateConverter is correctly getting invoked.
Thanks much again
Regards
Srini
==============
//UserManagerServiceTest.java
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();
}
}
////////////////////////////////
//UserManager.java
@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);
@GET
@Path("/getUserBeforeDate/{startDate}")
@Produces(MediaType.TEXT_PLAIN)
public String getUserBeforeDate(@PathParam("startDate") Date startDate);
}
/////////////////////
//config used on client-side "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:headers>
<entry key="Accept" value="application/json" />
<entry key="Content-Type" value="application/json" />
</jaxrs:headers> -->
<jaxrs:providers>
<ref bean="paramConverterProvider" />
</jaxrs:providers>
</jaxrs:client>
</beans>
//////////////
//SomeDateConverter.java
public class SomeDateConverter implements ParamConverter<Date> {
@Override
public Date fromString(String 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) {
return ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC)
.print(dateToConvert.getTime());
}
}
//ParamConverterProviderImpl.java
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);
}
}
//////