// Client test code
@Test
public void testTridionService() {
List<MessageBodyReader<org.apache.cxf.systest.jaxrs.Response>> providers
=
new
ArrayList<MessageBodyReader<org.apache.cxf.systest.jaxrs.Response>>();
providers.add(new ResponseReader());
// We also need to pass the provider for deserializing the response
// object.
TridionQueryService tridionQueryServiceProxy =
JAXRSClientFactory.create("http://localhost:9080",
TridionQueryService.class, providers);
org.apache.cxf.systest.jaxrs.Response r =
tridionQueryServiceProxy.executeQuery("query", "id");
assertNotNull(r);
}
// sample Response :
public class Response {
public int id;
}
// Response Reader, used on the client side
public class ResponseReader implements MessageBodyReader<Response> {
public boolean isReadable(Class type, Type genericType, Annotation[]
annotations, MediaType mediaType) {
// TODO Auto-generated method stub
return true;
}
public Response readFrom(Class arg0, Type arg1, Annotation[] arg2,
MediaType arg3, MultivaluedMap arg4,
InputStream arg5) throws IOException, WebApplicationException {
// TODO Auto-generated method stub
Response r = new Response();
XMLSource source = new XMLSource(arg5);
String id = source.getValue("response/id");
r.id = Integer.parseInt(id);
return r;
}
}
// ResponseWriter, used on the server side :
public class ResponseWriter implements MessageBodyWriter<Response> {
public long getSize(Response t, Class type, Type genericType,
Annotation[]
annotations, MediaType mediaType) {
// TODO Auto-generated method stub
return 0;
}
public boolean isWriteable(Class type, Type genericType, Annotation[]
annotations, MediaType mediaType) {
// TODO Auto-generated method stub
return true;
}
public void writeTo(Response arg0, Class arg1, Type arg2, Annotation[]
arg3, MediaType arg4,
MultivaluedMap arg5, OutputStream arg6) throws IOException,
WebApplicationException {
StringBuilder sb = new StringBuilder();
sb.append("<response><id>" + arg0.id + "</id></response>");
arg6.write(sb.toString().getBytes());
arg6.flush();
}
}
// TridionQueryServiceImpl :
public class TridionQueryServiceImpl implements TridionQueryService {
public Response executeQuery(String query, String publication) throws
WebApplicationException {
Response r = new Response();
r.id = 1;
return r;
}
}
// Server start up :
AXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setResourceClasses(TridionQueryServiceImpl.class);
List<Object> providers = new ArrayList<Object>();
providers.add(new ResponseWriter());
sf.setProviders(providers);
sf.setResourceProvider(TridionQueryServiceImpl.class,
new SingletonResourceProvider(new TridionQueryServiceImpl()));
sf.setAddress("http://localhost:9080/");
sf.create();
Vicio, can you please provbide more details : post sample response value,
sample Response and ResponseProvider, etc...
thanks, Sergey
----- Original Message ----- From: "Sergey Beryozkin" <
[email protected]>
To: <[email protected]>
Sent: Tuesday, June 16, 2009 10:05 AM
Subject: Re: Problem with JAXRSClientFactory after updating to 2.2.2
Hi
Sorry, your messages have been caught by the spam filter.
Can you please use JAXRSClientFactoryBean directly please, may be
there're
some overloading issues among the factory utility methods..
Trying to do a quick test now...
cheers, Sergey
----- Original Message ----- From: "Vincenzo Vitale" <
[email protected]>
To: <[email protected]>
Sent: Monday, June 15, 2009 11:59 AM
Subject: Problem with JAXRSClientFactory after updating to 2.2.2
Hi,
after updating to CXF 2.2.2 the JAXRSClientFactory seems to not work
anymore having the entity field returned always to null.
Here my code:
ArrayList<MessageBodyReader<Response>> providers =
new ArrayList<MessageBodyReader<Response>>();
providers.add(new ResponseProvider());
// We also need to pass the provider for deserializing the
response
// object.
tridionQueryServiceProxy =
JAXRSClientFactory.create(getTridionProxyBaseAddress(),
TridionQueryService.class, providers);
and than:
tridionProxyResponse
= tridionQueryServiceProxy.executeQuery(query.toString(),
publicationId);
The common interface between server and client is:
@Path("/query-service")
@Produces("application/xml")
public interface TridionQueryService {
/**
* Execute a generic query in the Tridion system through a POST
request.
*
* @param query The query to be executed.
* @param publicationId The publication to use (in a normal Tridion
* implementation the publication id specify the channel to
use).
If
* the parameter is not passed a default value (different
depending
* on the implementation) will be used.
* @return A {...@link Response} object containing the xml response
received
* from Tridion..
*/
@POST
@Path("/execute")
Response executeQuery(@FormParam("query") String query,
@FormParam("channel") String publication)
throws WebApplicationException;
Is someone experiencing the same problem. Is it a bug in CXF?
Thanks,
Vicio.