Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id E830318A22 for ; Mon, 29 Feb 2016 10:48:00 +0000 (UTC) Received: (qmail 95994 invoked by uid 500); 29 Feb 2016 10:47:51 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 95930 invoked by uid 500); 29 Feb 2016 10:47:51 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 95921 invoked by uid 99); 29 Feb 2016 10:47:51 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 29 Feb 2016 10:47:51 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id D65E8C0140 for ; Mon, 29 Feb 2016 10:47:50 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 2.471 X-Spam-Level: ** X-Spam-Status: No, score=2.471 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, KAM_LIVE=1, RP_MATCHES_RCVD=-0.329] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id EMhduU5KUbPR for ; Mon, 29 Feb 2016 10:47:44 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with ESMTP id B503B5F1B9 for ; Mon, 29 Feb 2016 10:47:43 +0000 (UTC) Received: from svn01-us-west.apache.org (svn.apache.org [10.41.0.6]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id B595BE05DB for ; Mon, 29 Feb 2016 10:47:42 +0000 (UTC) Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id B549C3A0052 for ; Mon, 29 Feb 2016 10:47:42 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r981373 - in /websites/production/cxf/content: cache/docs.pageCache docs/jax-rs-advanced-features.html Date: Mon, 29 Feb 2016 10:47:42 -0000 To: commits@cxf.apache.org From: buildbot@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20160229104742.B549C3A0052@svn01-us-west.apache.org> Author: buildbot Date: Mon Feb 29 10:47:42 2016 New Revision: 981373 Log: Production update by buildbot for cxf Modified: websites/production/cxf/content/cache/docs.pageCache websites/production/cxf/content/docs/jax-rs-advanced-features.html Modified: websites/production/cxf/content/cache/docs.pageCache ============================================================================== Binary files - no diff available. Modified: websites/production/cxf/content/docs/jax-rs-advanced-features.html ============================================================================== --- websites/production/cxf/content/docs/jax-rs-advanced-features.html (original) +++ websites/production/cxf/content/docs/jax-rs-advanced-features.html Mon Feb 29 10:47:42 2016 @@ -117,63 +117,26 @@ Apache CXF -- JAX-RS Advanced Features
-

JAX-RS : Advanced Features

+

 

 

 

 

 JAX-RS : Advanced Features 

 

 

 

 

+/*]]>*/

- -

JMS Support

- -

CXF has been designed such that multiple transports can be supported for a given endpoint. CXF JAX-RS endpoint and proxies can optionally
-support the JMS transport.

- -

Endpoints

- -

If you would like your JAXRS endpoint be capable of serving not only HTTP but also JMS requests then you need to specify a JMS transportId, example:

- -
-
-<jaxrs:server serviceName="s:BookService" transportId="http://cxf.apache.org/transports/jms" address="/">
+

JMS Support

CXF has been designed such that multiple transports can be supported for a given endpoint. CXF JAX-RS endpoint and proxies can optionally
support the JMS transport.

Endpoints

If you would like your JAXRS endpoint be capable of serving not only HTTP but also JMS requests then you need to specify a JMS transportId, example:

+
<jaxrs:server serviceName="s:BookService" transportId="http://cxf.apache.org/transports/jms" address="/">
  <jaxrs:serviceBeans>
    <bean class="org.apache.cxf.systest.jaxrs.JMSBookStore"/>
  </jaxrs:serviceBeans>
 </jaxrs:server>
 
-
- -

Additionally, JMS queue or topic configuration needs to be done, for example, please see this beans.xml. Please note how a serviceName attribute is used to specify a service QName for a jaxrs endpoint (default is {http://reverse.package.name}ServiceClassName), this service name is
-used to configure a jms destination.

- -

Here is the actual test.

- -

Here are JMS properties which can help with matching a required method on the JAXRS endpoint :

-
  • "Content-Type" : default is "text/xml"
  • "Accept" : default is "/"
  • "OnewayMessage" : default is "false"
  • "org.apache.cxf.message.Message.REQUEST_URI" : default is "/"
  • "org.apache.cxf.message.Message.HTTP_REQUEST_METHOD" : default is "POST"
- - -

If JMS messages are sent to topic destinations then one has to either set a "OnewayMessage" property or ensure that target JAXRS methods are annotated with org.apache.cxf.jaxrs.ext.Oneway.

- -

As far as REQUEST_URI is concerned, it is initially matched against a jaxrs:server/@address. So if REQUEST_URI is not set or set to "/" then jaxrs:server/@address has to be set to "/". If REQUEST_URI is set to "/bar/foo" and
-jaxrs:server/@address is set to "/bar" then it will be '/foo' which will be used to find a root resource class and its method.

- -

By referencing a bean such as 'org.apache.cxf.systest.jaxrs.JMSBookStore' from multiple jaxrs endpoints you can ensure that both HTTP and JMS requests are handled by the same service bean. In such cases you may want to use a CXF JAXRS specific ProtocolHeaders context which will let you get either HTTP or JMS headers.

- -

Client

- -

Starting from CXF 2.5.5 and CXF 2.6.2 it is possible to use the client proxies to invoke on JMS endpoints. All one needs to do is to provide a JMS endpoint address and then continue working with the proxy as usual. For example:

- -
-
-// setup the the client
+

Additionally, JMS queue or topic configuration needs to be done, for example, please see this beans.xml. Please note how a serviceName attribute is used to specify a service QName for a jaxrs endpoint (default is {http://reverse.package.name}ServiceClassName), this service name is
used to configure a jms destination.

Here is the actual test.

Here are JMS properties which can help with matching a required method on the JAXRS endp oint :

  • "Content-Type" : default is "text/xml"
  • "Accept" : default is "/"
  • "OnewayMessage" : default is "false"
  • "org.apache.cxf.message.Message.REQUEST_URI" : default is "/"
  • "org.apache.cxf.message.Message.HTTP_REQUEST_METHOD" : default is "POST"

If JMS messages are sent to topic destinations then one has to either set a "OnewayMessage" property or ensure that target JAXRS methods are annotated with org.apache.cxf.jaxrs.ext.Oneway.

As far as REQUEST_URI is concerned, it is initially matched against a jaxrs:server/@address. So if REQUEST_URI is not set or set to "/" then jaxrs:server/@address has to be set to "/". If REQUEST_URI is set to "/bar/foo" and
jaxrs:server/@address is set to "/bar" then it will be '/foo' which will be used to find a root resource class and its method.

By referencing a bean such as 'org.apache.cxf.systest.jaxrs.JMSBookStore' from multiple jaxrs endpoints you can ensure that both HTTP and JMS requests are handled by the same service bean. In such cases you may want to use a CXF JAXRS specific ProtocolHeaders context which will let you get either HTTP or JMS headers.

Client

Starting from CXF 2.5.5 and CXF 2.6.2 it is possible to use the client proxies to invoke on JMS endpoints. All one needs to do is to provide a JMS endpoint address and then continue working with the proxy as usual. For example:

+
// setup the the client
 String endpointAddressUrlEncoded = "jms:jndi:dynamicQueues/test.jmstransport.text"
              + "?jndiInitialContextFactory=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
              + "&replyToName=dynamicQueues/test.jmstransport.response"
@@ -185,34 +148,8 @@ Book book = client.getBook("123");
 assertEquals("Get a wrong response code.", 200, WebClient.client(client).getResponse().getStatus());
 assertEquals("Get a wrong book id.", 123, book.getId());
 
-
- -

The client runtime will set up the JMS properties described in the previous section according to JAX-RS and other annotations (such as org.apache.cxf.jaxrs.ext.Oneway) available in JMSBookStore resource class.

- -

Advanced Search

- -

Please see JAX-RS Search for more information

- -

Oneway invocations

- -

Resource methods with an org.apache.cxf.jaxrs.ext.Oneway annotation will be invoked oneway with the original request returning 202 HTTP status. HTTP or JMS clients can also add a "OnewayRequest" header if adding Oneway annotations is not an option.

- -

Support for Continuations

- -

Please see this blog entry describing how JAXRS (and indeed) JAXWS services can rely on the CXF Continuations API.

- -

Please see the Continuations page for more information.

- -

Server-side caching

- -

Ehcache-Web and other similar frameworks can be used to provide an advanced support for
-the server-side caching.

- -

For example, the only thing you need to do to interpose Ehcache-Web on top of CXF JAX-RS endpoints is to add the following declarations to the web.xml, assuming the name of the war is 'ehcache-cxf':

- -
-
-<context-param>
+

The client runtime will set up the JMS properties described in the previous section according to JAX-RS and other annotations (such as org.apache.cxf.jaxrs.ext.Oneway) available in JMSBookStore resource class.

Advanced Search

Please see JAX-RS Search for more information

Oneway invocations

Resource methods with an org.apache.cxf.jaxrs.ext.Oneway annotation will be invoked oneway with the original request returning 202 HTTP status. HTTP or JMS clients can also add a "OnewayRequest" header if adding Oneway annotations is not an option.

Support for Continuations

Please see this blog entry describing how JAXRS (and indee d) JAXWS services can rely on the CXF Continuations API.

Please see the Continuations page for more information.

Server-side caching

Ehcache-Web and other similar frameworks can be used to provide an advanced support for
the server-side caching.

For example, the only thing you need to do to interpose Ehcache-Web on top of CXF JAX-RS endpoints is to add the following declarations to the web.xml, assuming the name of the war is 'ehcache-cxf':

+
<context-param>
         <param-name>webAppRootKey</param-name>
         <param-value>ehcache-cxf</param-value>
     </context-param>
@@ -230,12 +167,8 @@ the server-side caching.

<url-pattern>/*</url-pattern> </filter-mapping>
-
- -

Please see the Ehcache-Web page for more information on how to configure it, here is one example:

-
-
-<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+

Please see the Ehcache-Web page for more information on how to configure it, here is one example:

+
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="../../main/config/ehcache.xsd"
     updateCheck="false"
     monitoring="autodetect"
@@ -257,28 +190,8 @@ the server-side caching.

memoryStoreEvictionPolicy="LFU" /> </ehcache>
-
- -

This configuration has to be saved in ehcache-web.xml file and available as a class-path resource starting from the root.

- -

RESTful services without annotations

- -

One of the latest CXF JAX-RS extensions allows users to provide external models with the information which the runtime typically gets from JAX-RS annotations like @Path, @PathParam, @Consumes, @Produces, etc.
-There might be a number of cases when it can be advantageous to describe how a given resource can be exposed as a RESTful service without actually modifying this resource. For example, when new dynamic interface implementations are registered, when no source code can be modified, when the cost of future updates (for ex, modifying the value of @Path annotations) is considered to be expensive, etc.

- -

User model schema type is described in the jaxrs.xsd.

- -

The top-level 'model' element can have 'resource' children elements. A 'resource' element describes a resource class which can be either a root resource class or a sub-resource one and it can have attributes describing 'path', 'produces' and 'consumes' values and it has a 'name' attribute which identifies a fully-qualified resource class.
-A 'resource' element can have a number of 'operation' elements pointing to resource methods (with its 'name' attribute) and can have 'path', 'produces', 'consumes' and 'verb' (HTTP method) values. An 'operation' element which has no 'verb' attribute is treated as a sub-resource locator - a corresponding resource class has to be available in the model with its 'name' attribute matching the return type's name of this operation.
-Every operation can have a number of 'param' elements. A 'param' element should have its 'name' attribute matching a corresponding parameter name in the class resource method. Its 'type' can have the following values : 'PATH', 'QUERY', 'CONTEXT', 'HEADER', 'MATRIX', 'COOKIE', 'FORM' or 'REQUEST_BODY'. Parameters corresponding to response types do not have to be described. It can also have 'defaultValue' and 'encoded' values being set.

- -

Starting from CXF 2.3.2-SNAPSHOT a "oneway" attribute can also be applied to individual operations.

- -

Here is an example :

- -
-
-<model xmlns="http://cxf.apache.org/jaxrs">
+

This configuration has to be saved in ehcache-web.xml file and available as a class-path resource starting from the root.

RESTful services without annotations

One of the latest CXF JAX-RS extensions allows users to provide external models with the information which the runtime typically gets from JAX-RS annotations like @Path, @PathParam, @Consumes, @Produces, etc.
There might be a number of cases when it can be advantageous to describe how a given resource can be exposed as a RESTful service without actually modifying this resource. For example, when new dynamic interface implementations are registered, when no source code can be modified, when the cost of future updates (for ex, modifying the value of @Path annotations) is considered to be expensive, etc.

User model schema type is described in the jaxrs.xsd.

The top-level 'model' element can have 'resource' children elements. A 'resource' element describes a resource class which can be either a root resource class or a sub-resource one and it can have attributes describing 'path', 'produces' and 'consumes' values and it has a 'name' attribute which identifies a fully-qualified resource class.
A 'resource' element can have a number of 'operation' elements pointing to resource methods (with its 'name' attribute) and can have 'path', 'produces', 'consumes' and 'verb' (HTTP method) values. An 'operation' element which has no 'verb' attribute is treated as a sub-resource locator - a corresponding resource class has to be available in the model with its 'name' attribute matching the return type's name of this operation.
Every operation can have a number of 'param' elements. A 'param' element should have its 'nam e' attribute matching a corresponding parameter name in the class resource method. Its 'type' can have the following values : 'PATH', 'QUERY', 'CONTEXT', 'HEADER', 'MATRIX', 'COOKIE', 'FORM' or 'REQUEST_BODY'. Parameters corresponding to response types do not have to be described. It can also have 'defaultValue' and 'encoded' values being set.

Starting from CXF 2.3.2-SNAPSHOT a "oneway" attribute can also be applied to individual operations.

Here is an example :

+
<model xmlns="http://cxf.apache.org/jaxrs">
   <resource name="org.apache.cxf.systest.jaxrs.BookStoreNoAnnotations" path="bookstore"
     produces="application/json" consumes="application/json">
     <operation name="getBook" verb="GET" path="/books/{id}" produces="application/xml">
@@ -299,34 +212,8 @@ Every operation can have a number of 'pa
   </resource>
 </model>
 
-
- -

This model describes two resources, BookStoreNoAnnotations and ChapterNoAnnotations. The BookStoreNoAnnotations resource has three resource operations, 'getBook', 'getBookChapter' and 'updateBook'. Note that the 'getBookChapter' operation element (described in the model) has no 'verb' attribute so runtime will identify it as a subresource locator.
-The runtime will introspect the org.apache.cxf.systest.jaxrs.BookStoreNoAnnotations class and check the return types for both 'getBook' and 'getBookChapter' methods. BookStoreNoAnnotations.getBookChapter() method's return type is org.apache.cxf.systest.jaxrs.ChapterNoAnnotations so the model will be checked if it contains the resource element with the 'name' attribute equal to 'org.apache.cxf.systest.jaxrs.ChapterNoAnnotations'. After this resource has been found, the ChapterNoAnnotations class is recognized as a sub-resource and then its 'getItself' method is checked.

- -

Additionally the BookStoreNoAnnotations resource declares that all its resource methods produce 'application/json' mediaTypes, while its 'getBook' method overrides its with its own 'produces' value. BookStoreNoAnnotations resource also has a 'consumes' attribute which requires all of the resource methods (such as 'updateBook') to consume "application/json" formats. The ChapterNoAnnotations 'updateChapter' resource operation requires 'application/xml' formats.

- -

You can use a comma-seperated list of media type values if needed, for example, produces("application/xml;charset=utf-8,application/json") or consumes("application/xml;charset=utf-8,application/json").

- -

Please also see this model file for an example. Providing this file will let all implementations of the interface described in this model instance be exposed as RESTful services supported by the JAX-RS runtime.

- -

Configuration

- -

A user model can be referenced in a number of ways. It can be embedded in a jaxrs:server endpoint definition or linked to through a jaxrs:server modelRef attribute as a classpath resource.

- -

Please see this bean Spring configuration file, look at jaxrs server beans with 'bookservice6' and 'bookservice7' names.

- -

Note that when registering a model from Spring you do not need to declare a jaxrs server serviceBeans section - the runtime will instantiate the beans itself. If you do need to inject certain properties into your service bean from Spring then you do need to declare a service bean too. In this case this bean will be instantiated twice - once by the runtime during the model introspection and once by Spring, however in the end it will be the bean created by Spring that will be used, the one created by the runtime will be removed.
-You can avoid this double instantiation by having your model describing the interfaces which the actual root resource beans will implement. In this case only Spring will create a bean and the runtime will apply the model description to this injected bean. Note that if Spring proxifies your bean (for example by applying transaction aspects to it) then the model does have to describe an interface for a match between the model and the injected bean proxy to succeed.

- -

Please have a look at this Spring bean. The jaxrs endpoint with id 'bookservice2' will have BookStoreWithNoAnnotations created twice but it will be the Spring created BookStoreWithNoAnnotations bean that will serve as a resource class instance. The jaxrs endpoint with id 'bookservice3' will have BookStoreWithNoAnnotationsImpl class instantiated only by Spring, with the model describing BookStoreWithNoAnnotationsInterface only that this class implements.

- - -

You can also register a model programmatically, for example :

- -
-
-JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
+

This model describes two resources, BookStoreNoAnnotations and ChapterNoAnnotations. The BookStoreNoAnnotations resource has three resource operations, 'getBook', 'getBookChapter' and 'updateBook'. Note that the 'getBookChapter' operation element (described in the model) has no 'verb' attribute so runtime will identify it as a subresource locator.
The runtime will introspect the org.apache.cxf.systest.jaxrs.BookStoreNoAnnotations class and check the return types for both 'getBook' and 'getBookChapter' methods. BookStoreNoAnnotations.getBookChapter() method's return type is org.apache.cxf.systest.jaxrs.ChapterN oAnnotations so the model will be checked if it contains the resource element with the 'name' attribute equal to 'org.apache.cxf.systest.jaxrs.ChapterNoAnnotations'. After this resource has been found, the ChapterNoAnnotations class is recognized as a sub-resource and then its 'getItself' method is checked.

Additionally the BookStoreNoAnnotations resource declares that all its resource methods produce 'application/json' mediaTypes, while its 'getBook' method overrides its with its own 'produces' value. BookStoreNoAnnotations resource also has a 'consumes' attribute which requires all of the resource methods (such as 'updateBook') to consume "application/json" formats. The ChapterNoAnnotations 'updateChapter' resource operation requires 'application/xml' formats.

You can use a comma-seperated list of media type values if needed, for example, produces("application/xml;charset=utf-8,application/json") or consumes("application/xml;charset=utf-8,application/json").

Please also see this model file for an example. Providing this file will let all implementations of the interface described in this model instance be exposed as RESTful services supported by the JAX-RS runtime.

Configuration

A user model can be referenced in a number of ways. It can be embedded in a jaxrs:server endpoint definition or linked to through a jaxrs:server modelRef attribute as a classpath resource.

Please see this bean Spring configuration file, look at jaxrs server beans with 'bookservice6' and 'bookservice7' names.

Note that when registering a model from Spring you do not need to decla re a jaxrs server serviceBeans section - the runtime will instantiate the beans itself. If you do need to inject certain properties into your service bean from Spring then you do need to declare a service bean too. In this case this bean will be instantiated twice - once by the runtime during the model introspection and once by Spring, however in the end it will be the bean created by Spring that will be used, the one created by the runtime will be removed.
You can avoid this double instantiation by having your model describing the interfaces which the actual root resource beans will implement. In this case only Spring will create a bean and the runtime will apply the model description to this injected bean. Note that if Spring proxifies your bean (for example by applying transaction aspects to it) then the model does have to describe an interface for a match between the model and the injected bean proxy to succeed.

Please have a look at this Spring bean. The jaxrs endpoint with id 'bookservice2' will have BookStoreWithNoAnnotations created twice but it will be the Spring created BookStoreWithNoAnnotations bean that will serve as a resource class instance. The jaxrs endpoint with id 'bookservice3' will have BookStoreWithNoAnnotationsImpl class instantiated only by Spring, with the model describing BookStoreWithNoAnnotationsInterface only that this class implements.

You can also register a model programmatically, for example :

+
JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
             sf.setAddress("http://localhost:9080/");
 String modelRef = "classpath:/org/apache/cxf/systest/jaxrs/resources/resources2.xml";
 sf.setModelRef(modelRef);
@@ -337,29 +224,15 @@ sf.setModelRef(modelRef);
 // register an actual bean only if the model describes interfaces
 sf.setServiceBeans(new BookStoreNoAnnotationsImpl());
 
-
- -

Please also see this system test for the example of how model beans like UserResource can be created and registered programmatically.

- -

Similarly, you can register a user model on the client side, either from jaxrs:client or programmatically, example :

- -
-
-JAXRSClientFactoryBean cf = new JAXRSClientFactoryBean();
+

Please also see this system test for the example of how model beans like UserResource can be created and registered programmatically.

Similarly, you can register a user model on the client side, either from jaxrs:client or programmatically, example :

+
JAXRSClientFactoryBean cf = new JAXRSClientFactoryBean();
 cf.setAddress("http://localhost:9080/");
 String modelRef = "classpath:/org/apache/cxf/systest/jaxrs/resources/resources2.xml";
 sf.setModelRef(modelRef);
 BookStoreNoAnnotations proxy = cf.create(BookStoreNoAnnotations.class);
 
-
- -

At the moment it is only possible to register a user model with CXFNonSpringJAXRSServlet using the latest 2.2.3-SNAPSHOT like the way it is done in this web.xml. See CXFServlet3 and CXFServlet4 servlet declarations. Note that CXFServlet4 registers a model containing interfaces so it also registers a BookStoreNoAnnotationsImpl service class.

- -

The workaround is to create a custom servlet :

- -
-
-public class JAXRSUserModelServlet extends CXFNonSpringJaxrsServlet  {
+

At the moment it is only possible to register a user model with CXFNonSpringJAXRSServlet using the latest 2.2.3-SNAPSHOT like the way it is done in this web.xml. See CXFServlet3 and CXFServlet4 servlet declarations. Note that CXFServlet4 registers a model containing interfaces so it also registers a BookStoreNoAnnotationsImpl service class.

The workaround is to create a custom servlet :

+
public class JAXRSUserModelServlet extends CXFNonSpringJaxrsServlet  {
 
 @Override
 public void loadBus(ServletConfig servletConfig) throws ServletException {