Hi,

I'm forwarding to the users list

The interface has a top-level @Produces annotation and the proxy uses it to create an "Accept : application/json" which does not match @Produces("text/plain"). It appears to be a bug in the way the proxy determines the right Accept type.

Please push the top level Produces/Consumes to a post method for now and it should fix it. I'll have a look at why a preferred @Produces("text/plain") is not used on the proxy in this case.

Or use WebClient or JAX-RS 2.0 client API

Cheers, Sergey


On 10/09/14 22:16, Nagulapalli, Srinivas wrote:
Hi

When invoking simple JAX-RS service marshalling java.util.Date, it works on 
server side, but on client side when invoking after making sure 
ParameterConverter is added to jaxrs:providers element
Under jaxrs:client, it gives error saying the method cannot be matched.  3.0.2 
snapshot has fix for date marshalling and want to make sure if I am missing 
something.

Stacktrace, client invoking code and config used + Server side code and its 
config are below.

Using: cxf-*-3.0.2 snapshot (because it has fix for the needed Date marshalling)
cxf-core-3.0.2-20140828.070840-30.jar, 
cxf-rt-frontend-jaxrs-3.0.2-20140828.071806-27.jar, 
cxf-rt-rs-client.3.0.2-20140828.072409-26.jar, 
cxf-rt-rs-service-description-3.0.2-20140828.071832-27.jar
cxf-rt-transports-http-3.0.2-20140828.071216-27.jar

Appreciate greatly any help or pointers.

Thanks
Srini
Stacktrace:

WARN http-bio-8080-exec-8 org.apache.cxf.jaxrs.utils.JAXRSUtils - No operation matching 
request path 
"/RestDemo2/services/rest/UserManager/getUserBeforeDate/1959-01-01T00:00:00.000Z"
 is found, Relative Path: /getUserBeforeDate/1959-01-01T00:00:00.000Z, HTTP Method: GET, 
ContentType: application/json, Accept: application/json,. Please enable FINE/TRACE log 
level for more details.
WARN http-bio-8080-exec-8 
org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper - 
javax.ws.rs.ClientErrorException: HTTP 406 Not Acceptable
         at 
org.apache.cxf.jaxrs.utils.SpecExceptions.toHttpException(SpecExceptions.java:117)
         at 
org.apache.cxf.jaxrs.utils.ExceptionUtils.toHttpException(ExceptionUtils.java:157)
         at 
org.apache.cxf.jaxrs.utils.JAXRSUtils.findTargetMethod(JAXRSUtils.java:526)
         at 
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:177)
         at 
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:77)
         at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
         at 
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
         at 
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:243)
         at 
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:223)
         at 
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:197)
         at 
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:149)
         at 
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:171)
         at 
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:290)
         at 
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:214)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
         at 
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:265)
         at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
         at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
         at 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
         at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
         at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
         at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
         at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
         at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
         at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
         at 
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
         at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
         at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
         at 
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
         at 
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
         at 
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
         at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
         at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
         at 
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
         at java.lang.Thread.run(Thread.java:724)
/////////////////////
//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(1959, 1, 1, 0, 0, 
DateTimeZone.UTC).toDate();
                 Date endDate = new DateTime(1962, 1, 1, 0, 0, 
DateTimeZone.UTC).toDate();

                 userManagerService.getUserBeforeDate(startDate);
                 userManagerService.getUserByDateRange(startDate, endDate);
                 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: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>


/////Server side://////
//UserManager.java:

@Consumes("application/json")
@Produces("application/json")
public interface UserManager
{
         @GET
         @Path("/getUserByDateRange/{startDate}/{endDate}")
          @Produces(MediaType.TEXT_PLAIN)
         public String getUserByDateRange(@PathParam("startDate") Date startDate, 
@PathParam("endDate") Date endDate);

         @GET
         @Path("/getUserBeforeDate/{startDate}")
          @Produces(MediaType.TEXT_PLAIN)
         public String getUserBeforeDate(@PathParam("startDate") Date 
startDate);

         @POST
         @Path("/insertUser/")
         public UserResponse insertUser(UserRequest request);
}
////////////////////////
//UserManagerService.java

public class UserManagerService implements UserManager{
         private UserManagerDao userDao;
         public UserManagerDao getUserDao(){return userDao;}
         public void setUserDao(UserManagerDao userDao){this.userDao = userDao;}

         public String getUserByDateRange(Date startDate, Date endDate){
                 String response = new String();
                 StringBuffer buf = new StringBuffer();
                 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 getUserBeforeDate(Date startDate){
                 String response = new String();
                 StringBuffer buf = new StringBuffer();
                 try{
                         List<User> listUsers = 
getUserDao().fetchUserBeforeDate(startDate);
                         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 UserResponse insertUser(UserRequest request){
                 UserResponse response = new UserResponse();
                 try{
                         getUserDao().insertUser(request.getUser());
                 }
                 catch (Exception e){
                         response.setSuccess(false);
                         response.setErrorMessage(e.getClass() + ": " + 
e.getMessage());
                 }
                 return response;
         }
}
/////////////////////////////////
//SomeDateConverter.java
public class SomeDateConverter implements ParamConverter<Date> {
         Logger logger = LoggerFactory.getLogger(SomeDateConverter.class);
         @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);
         }
}
////////////////////////
//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

Reply via email to