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>
////////////////////////////
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/
Blog: http://sberyozkin.blogspot.com