...
See this bean for a full example of how jaxrs:client can be used to inject a proxy
Buffering Responses
One way to buffer proxy responses is to have a proxy method return JAX-RS Response, use its bufferEntity() method (available in JAX-RS 2.0) and use Response.readEntity which can return typed responses if preferred.
The other option is to have a "buffer.proxy.response" property enabled on a given proxy instance.
Limitations
Proxy sub-resource methods returning Objects can not be invoked. Prefer to have sub-resource methods returning typed classes: interfaces, abstract classes or concrete implementations.
The following applies to CXF 2.6.x-2.4.x only:
When a proxy method returning a JAX-RS Response is invoked, the returned Response.getEntity() will return a response InputStream by default. Starting with CXF 2.3.2 one can register an org.apache.cxf.jaxrs.client.ResponseReader provider and cast the Response.getEntity() to more specific application classes:
. Note that WebClient can also be injected as a jaxrs:client.
Asynchronous proxy invocations
Starting from CXF 3.1.7 it is possible to do the asynchronous proxy invocations. One needs to register JAX-RS 2.0 InvocationCallback as a proxy request context property:
Code Block | ||||
---|---|---|---|---|
| ||||
BookStore proxy = JAXRSClientFactory.create("http://books", BookStore.class);
Book book = null;
final InvocationCallback<Book> callback = new InvocationCallback<Book>() {
public void completed(Book response) {
book = response;
}
public void failed(Throwable error) {
}
};
WebClient.getConfig(proxy).getRequestContext().put(InvocationCallback.class.getName(), callback);
assertNull(proxy.getBook());
Thread.sleep(3);
assertNotNull(book); |
If you have a proxy with different methods returning different response types then either register an Object bound InvocationCallback or register a collection of type-specific callbacks:
Code Block | ||||
---|---|---|---|---|
| ||||
BookStore proxy = JAXRSClientFactory.create("http://books", BookStore.class);
// Book
Book book = null;
final InvocationCallback<Book> bookCallback = new InvocationCallback<Book>() {
public void completed(Book response) {
book = response;
}
public void failed(Throwable error) {
}
};
// Chapter
Chapter chapter = null;
final InvocationCallback<Chapter> chapterCallback = new InvocationCallback<Chapter>() {
public void completed(Chapter response) {
chapter = response;
}
public void failed(Throwable error) {
}
};
WebClient.getConfig(proxy).getRequestContext().put(InvocationCallback.class.getName(),
| ||||
Code Block | ||||
java | java | ResponseReader reader = new ResponseReader(); reader.setEntityClass(Book.class); BookStore bs = JAXRSClientFactory.create("http://localhost:8080/books", BookStore.class, Arrays.asList(bookCallback, chapterCallback)); // Get Book assertNull(proxy.getBook(123L)); Thread.sleep(3); assertNotNull(book); // Get Collections.singletonList(reader)); Response r1 = bs.getBook("123"); Book book = (Book)r1.getEntity(); reader.setEntityClass(Author.class); Response r2 = bs.getBookAuthor("123"); Author book = (Author)r2.getEntity(); Book Chapter assertNull(proxy.getBookChapter(123L)); Thread.sleep(3); assertNotNull(chapter); |
Make sure a proxy is created in a thread safe mode if it is being accessed by multiple threads for every new request thread to have its own callback.
Buffering Responses
One way to buffer proxy responses is to have a proxy method return JAX-RS Response, use its bufferEntity() method (available in JAX-RS 2.0) and use Response.readEntity which can return typed responses if preferred.
The other option is to have a "buffer.proxy.response" property enabled on a given proxy instance.
Limitations
Proxy sub-resource methods returning Objects can not be invoked. Prefer to have sub-resource methods returning typed classes: interfaces, abstract classes or concrete implementations.
Working with user models
Proxies can be created with the external user model being applied to a proxy class, for example:
...