Right, you explicitly set the headers in jaxrs:client and that overrides the headers the proxy deduces from the UserManager interface.
Just remove those jaxrs;client headers...

Sergey

On 11/09/14 09:45, Sergey Beryozkin wrote:
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