You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by bu...@apache.org on 2019/05/08 16:56:49 UTC

svn commit: r1044685 - in /websites/production/cxf/content: cache/docs.pageCache docs/jax-rs-advanced-features.html

Author: buildbot
Date: Wed May  8 16:56:49 2019
New Revision: 1044685

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 Wed May  8 16:56:49 2019
@@ -99,15 +99,7 @@ Apache CXF -- JAX-RS Advanced Features
                 <div id="wrapper-menu-page-bottom">
                   <div id="menu-page">
                     <!-- NavigationBar -->
-<div id="navigation"><ul class="alternate"><li><a shape="rect" href="overview.html">Overview</a></li><li><a shape="rect" href="how-tos.html">How-Tos</a></li><li><a shape="rect" href="frontends.html">Frontends</a></li><li><a shape="rect" href="databindings.html">DataBindings</a></li><li><a shape="rect" href="transports.html">Transports</a></li><li><a shape="rect" href="configuration.html">Configuration</a></li><li><a shape="rect" href="debugging-and-logging.html">Debugging and Logging</a></li><li><a shape="rect" href="tools.html">Tools</a></li><li><a shape="rect" href="restful-services.html">RESTful Services</a></li><li><a shape="rect" href="wsdl-bindings.html">WSDL Bindings</a></li><li><a shape="rect" href="service-routing.html">Service Routing</a></li><li><a shape="rect" href="dynamic-languages.html">Dynamic Languages</a></li><li><a shape="rect" href="ws-support.html">WS-* Support</a></li><li><a shape="rect" href="advanced-integration.html">Advanced Integration</a></li><li><a shape
 ="rect" href="deployment.html">Deployment</a></li><li><a shape="rect" href="schemas-and-namespaces.html">Use of Schemas and Namespaces</a></li></ul><hr><ul class="alternate"><li><p>Search</p></li></ul><form enctype="application/x-www-form-urlencoded" method="get" id="cse-search-box" action="http://www.google.com/cse">
-  <div>
-    <input type="hidden" name="cx" value="002890367768291051730:o99qiwa09y4">
-    <input type="hidden" name="ie" value="UTF-8">
-    <input type="text" name="q" size="21">
-    <input type="submit" name="sa" value="Search">
-  </div>
-</form>
-<script type="text/javascript" src="http://www.google.com/cse/brand?form=cse-search-box&amp;lang=en"></script><hr><ul class="alternate"><li><a shape="rect" href="http://cxf.apache.org/javadoc/latest/">API 3.2.x (Javadoc)</a></li><li><a shape="rect" href="http://cxf.apache.org/javadoc/latest-3.1.x/">API 3.1.x (Javadoc)</a></li><li><a shape="rect" href="http://cxf.apache.org/">CXF Website</a></li></ul><p>&#160;</p><p><a shape="rect" class="external-link" href="http://www.apache.org/events/current-event.html"><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image confluence-external-resource" src="http://www.apache.org/events/current-event-125x125.png" data-image-src="http://www.apache.org/events/current-event-125x125.png"></span></a></p></div>
+<div id="navigation"><ul class="alternate"><li><a shape="rect" href="overview.html">Overview</a></li><li><a shape="rect" href="how-tos.html">How-Tos</a></li><li><a shape="rect" href="frontends.html">Frontends</a></li><li><a shape="rect" href="databindings.html">DataBindings</a></li><li><a shape="rect" href="transports.html">Transports</a></li><li><a shape="rect" href="configuration.html">Configuration</a></li><li><a shape="rect" href="debugging-and-logging.html">Debugging and Logging</a></li><li><a shape="rect" href="tools.html">Tools</a></li><li><a shape="rect" href="restful-services.html">RESTful Services</a></li><li><a shape="rect" href="wsdl-bindings.html">WSDL Bindings</a></li><li><a shape="rect" href="service-routing.html">Service Routing</a></li><li><a shape="rect" href="dynamic-languages.html">Dynamic Languages</a></li><li><a shape="rect" href="ws-support.html">WS-* Support</a></li><li><a shape="rect" href="advanced-integration.html">Advanced Integration</a></li><li><a shape
 ="rect" href="deployment.html">Deployment</a></li><li><a shape="rect" href="schemas-and-namespaces.html">Use of Schemas and Namespaces</a></li></ul><hr><ul class="alternate"><li><p>Search</p></li></ul><div class="aui-message aui-message-error"><p class="title"><strong>Error rendering macro 'html'</strong></p><p>Your Confluence administrator has disallowed the use of Javascript in the HTML macro.  This setting can be changed using  HTML for Confluence Configuration.  Please see your administrator for details.</p></div><hr><ul class="alternate"><li><a shape="rect" href="http://cxf.apache.org/javadoc/latest/">API 3.2.x (Javadoc)</a></li><li><a shape="rect" href="http://cxf.apache.org/javadoc/latest-3.1.x/">API 3.1.x (Javadoc)</a></li><li><a shape="rect" href="http://cxf.apache.org/">CXF Website</a></li></ul><p>&#160;</p><p><a shape="rect" class="external-link" href="http://www.apache.org/events/current-event.html"><span class="confluence-embedded-file-wrapper"><img class="confluence-em
 bedded-image confluence-external-resource" src="http://www.apache.org/events/current-event-125x125.png" data-image-src="http://www.apache.org/events/current-event-125x125.png"></span></a></p></div>
                     <!-- NavigationBar -->
                   </div>
               </div>
@@ -120,12 +112,12 @@ Apache CXF -- JAX-RS Advanced Features
 <div id="ConfluenceContent"><p><br clear="none"><span style="font-size:2em;font-weight:bold">JAX-RS : Advanced Features</span>
 
 
-&#160;</p><p><br clear="none"></p><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1544637371313 {padding: 0px;}
-div.rbtoc1544637371313 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1544637371313 li {margin-left: 0px;padding-left: 0px;}
+<br clear="none"></p><p><br clear="none"></p><p><style type="text/css">/*<![CDATA[*/
+div.rbtoc1557334569731 {padding: 0px;}
+div.rbtoc1557334569731 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1557334569731 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1544637371313">
+/*]]>*/</style></p><div class="toc-macro rbtoc1557334569731">
 <ul class="toc-indentation"><li><a shape="rect" href="#JAX-RSAdvancedFeatures-JMSSupport">JMS Support</a>
 <ul class="toc-indentation"><li><a shape="rect" href="#JAX-RSAdvancedFeatures-Endpoints">Endpoints</a></li><li><a shape="rect" href="#JAX-RSAdvancedFeatures-Client">Client</a></li></ul>
 </li><li><a shape="rect" href="#JAX-RSAdvancedFeatures-AdvancedSearch">Advanced Search</a></li><li><a shape="rect" href="#JAX-RSAdvancedFeatures-Onewayinvocations">Oneway invocations</a></li><li><a shape="rect" href="#JAX-RSAdvancedFeatures-SupportforContinuations">Support for Continuations</a></li><li><a shape="rect" href="#JAX-RSAdvancedFeatures-Client-sidecaching">Client-side caching</a></li><li><a shape="rect" href="#JAX-RSAdvancedFeatures-Server-sidecaching">Server-side caching</a></li><li><a shape="rect" href="#JAX-RSAdvancedFeatures-RESTfulserviceswithoutannotations">RESTful services without annotations</a>
@@ -138,7 +130,7 @@ div.rbtoc1544637371313 li {margin-left:
  &lt;/jaxrs:serviceBeans&gt;
 &lt;/jaxrs:server&gt;
 </pre>
-</div></div><p>Additionally, JMS queue or topic <a shape="rect" href="http://cxf.apache.org/docs/using-the-jmsconfigfeature.html">configuration</a> needs to be done, for example, please see this <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jms/jms_server_config.xml" rel="nofollow">beans.xml</a>. Please note how a serviceName attribute is used to specify a service QName for a jaxrs endpoint (default is {<a shape="rect" class="external-link" href="http://reverse.package.name" rel="nofollow">http://reverse.package.name</a>}ServiceClassName), this service name is used to configure a jms destination.</p><p>Here is the actual <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jms/JAXRSJmsTest.java" rel="nofollow">test</a>.</p><p>Here are JMS properties which can help with matching a required method o
 n the JAXRS endpoint :</p><ul class="alternate"><li>"Content-Type" : default is "text/xml"</li><li>"Accept" : default is "<strong>/</strong>"</li><li>"OnewayMessage" : default is "false"</li><li>"org.apache.cxf.message.Message.REQUEST_URI" : default is "/"</li><li>"org.apache.cxf.message.Message.HTTP_REQUEST_METHOD" : default is "POST"</li></ul><p>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.</p><p>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<br clear="none"> 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.</p><p>By referencing a bean such as 'org.apache.cxf.systest.jaxrs.JMSBookStore' fro
 m 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 <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/ProtocolHeaders.java" rel="nofollow">ProtocolHeaders</a> context which will let you get either HTTP or JMS headers.</p><h2 id="JAX-RSAdvancedFeatures-Client">Client</h2><p>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:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>Additionally, JMS queue or topic <a shape="rect" href="http://cxf.apache.org/docs/using-the-jmsconfigfeature.html">configuration</a> needs to be done, for example, please see this <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jms/jms_server_config.xml" rel="nofollow">beans.xml</a>. Please note how a serviceName attribute is used to specify a service QName for a jaxrs endpoint (default is {<a shape="rect" class="external-link" href="http://reverse.package.name" rel="nofollow">http://reverse.package.name</a>}ServiceClassName), this service name is used to configure a jms destination.</p><p>Here is the actual <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/jms/JAXRSJmsTest.java" rel="nofollow">test</a>.</p><p>Here are JMS properties which can help with matching a required method o
 n the JAXRS endpoint :</p><ul class="alternate"><li>"Content-Type" : default is "text/xml"</li><li>"Accept" : default is "<strong>/</strong>"</li><li>"OnewayMessage" : default is "false"</li><li>"org.apache.cxf.message.Message.REQUEST_URI" : default is "/"</li><li>"org.apache.cxf.message.Message.HTTP_REQUEST_METHOD" : default is "POST"</li></ul><p>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.</p><p>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<br clear="none">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.</p><p>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 <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/ProtocolHeaders.java" rel="nofollow">ProtocolHeaders</a> context which will let you get either HTTP or JMS headers.</p><h2 id="JAX-RSAdvancedFeatures-Client">Client</h2><p>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:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default">// setup the the client
 String endpointAddressUrlEncoded = "jms:jndi:dynamicQueues/test.jmstransport.text"
              + "?jndiInitialContextFactory=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
@@ -162,7 +154,7 @@ assertEquals("Get a wrong book id.", 123
     &lt;artifactId&gt;ehcache&lt;/artifactId&gt;
     &lt;version&gt;3.0.3&lt;/version&gt;
 &lt;/dependency&gt;</pre>
-</div></div><p>CacheControlFeature parses the Cache-Control header and caches the Response payload if appropriate for the "max-age" attribute of Cache-Control. The next time the client calls out to the remote service (only GET is supported for now), the Response payload is retrieved from the cache and returned instead (assuming it is not expired), thus avoiding an unnecessary round-trip. Here is an example:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>CacheControlFeature parses the Cache-Control header and caches the Response payload if appropriate for the "max-age" attribute of Cache-Control (or the "Expires" HTTP header if max-age is not specified). The next time the client calls out to the remote service (only GET is supported for now), the Response payload is retrieved from the cache and returned instead (assuming it is not expired), thus avoiding an unnecessary round-trip. Here is an example:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default">CacheControlFeature cacheControlFeature = new CacheControlFeature();
 cacheControlFeature.setCacheResponseInputStream(true);
 Client client = ClientBuilder.newBuilder()
@@ -174,7 +166,7 @@ WebTarget target = client.target(endpoin
 Response response = target.request().get();
 // Second call should be cached
 target.request().get();</pre>
-</div></div><p>&#160;</p><h1 id="JAX-RSAdvancedFeatures-Server-sidecaching">Server-side caching</h1><p><a shape="rect" class="external-link" href="http://ehcache.org/documentation/web_caching.html" rel="nofollow">Ehcache-Web</a> and other similar frameworks can be used to provide an advanced support for the server-side caching.</p><p>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':</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>If the initial response from the service contains an "ETag" HTTP header, then once the message has expired, CXF will send this value to the service as the "If-None-Match" header. Similarly, "Last-Modified" is sent as "If-Modified-Since". The CXF client will also cache the expired payload. If the service responds with a 304 status code, then the old message payload is returned to the client.</p><h1 id="JAX-RSAdvancedFeatures-Server-sidecaching">Server-side caching</h1><p><a shape="rect" class="external-link" href="http://ehcache.org/documentation/web_caching.html" rel="nofollow">Ehcache-Web</a> and other similar frameworks can be used to provide an advanced support for the server-side caching.</p><p>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':</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeC
 ontent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default">&lt;context-param&gt;
     &lt;param-name&gt;webAppRootKey&lt;/param-name&gt;
     &lt;param-value&gt;ehcache-cxf&lt;/param-value&gt;
@@ -216,7 +208,7 @@ target.request().get();</pre>
         memoryStoreEvictionPolicy="LFU" /&gt;
 &lt;/ehcache&gt;
 </pre>
-</div></div><p>This configuration has to be saved in ehcache-web.xml file and available as a class-path resource starting from the root.</p><h1 id="JAX-RSAdvancedFeatures-RESTfulserviceswithoutannotations">RESTful services without annotations</h1><p>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.<br clear="none"> 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.</p><p>User model schema type is described in the <a shape="rect" class="external-link" href="https://github.com/apache/cx
 f/blob/master/rt/frontend/jaxrs/src/main/resources/schemas/jaxrs-common.xsd" rel="nofollow">jaxrs.xsd</a>.</p><p>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. <br clear="none"> 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.<br clear="none"> Every operation can have a number of 'param' elements. A 'param' element shoul
 d 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.</p><p>Starting from CXF 2.3.2-SNAPSHOT a "oneway" attribute can also be applied to individual operations.</p><p>Here is an example :</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>This configuration has to be saved in ehcache-web.xml file and available as a class-path resource starting from the root.</p><h1 id="JAX-RSAdvancedFeatures-RESTfulserviceswithoutannotations">RESTful services without annotations</h1><p>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.<br clear="none">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.</p><p>User model schema type is described in the <a shape="rect" class="external-link" href="https://github.com/apache/cxf
 /blob/master/rt/frontend/jaxrs/src/main/resources/schemas/jaxrs-common.xsd" rel="nofollow">jaxrs.xsd</a>.</p><p>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. <br clear="none">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.<br clear="none">Every operation can have a number of 'param' elements. A 'param' element should h
 ave 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.</p><p>Starting from CXF 2.3.2-SNAPSHOT a "oneway" attribute can also be applied to individual operations.</p><p>Here is an example :</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default">&lt;model xmlns="http://cxf.apache.org/jaxrs"&gt;
   &lt;resource name="org.apache.cxf.systest.jaxrs.BookStoreNoAnnotations" path="bookstore"
     produces="application/json" consumes="application/json"&gt;
@@ -238,7 +230,7 @@ target.request().get();</pre>
   &lt;/resource&gt;
 &lt;/model&gt;
 </pre>
-</div></div><p>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.<br clear="none"> The runtime will introspect the <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreNoAnnotations.java" rel="nofollow">org.apache.cxf.systest.jaxrs.BookStoreNoAnnotations</a> class and check the return types for both 'getBook' and 'getBookChapter' methods. BookStoreNoAnnotations.getBookChapter() method's return type is <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/ChapterNoAnnotations.java" rel="nofollow">org.apa
 che.cxf.systest.jaxrs.ChapterNoAnnotations</a> 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.</p><p>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.</p><p>You can use a comma-separated list of media type values if needed, for example, produces("application/xml;charset=utf-8,application/json") or consumes("application/xml;charset=ut
 f-8,application/json").</p><p>Please also see this <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/resources2.xml" rel="nofollow">model file</a> 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.</p><h2 id="JAX-RSAdvancedFeatures-Configuration">Configuration</h2><p>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.</p><p>Please see this <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml" rel="nofollow">bean</a> Spring configuration file, look at jaxrs server beans with 'bookservice6' and 'bookservice7' names.</p><p>Note that w
 hen 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.<br clear="none"> 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.</p><p>Please have a look at <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_proxy/WEB-INF/beans.xml" rel="nofollow">this Spring bean</a>. 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.</p><p>You can also register a model programmatically, for example :</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>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.<br clear="none">The runtime will introspect the <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreNoAnnotations.java" rel="nofollow">org.apache.cxf.systest.jaxrs.BookStoreNoAnnotations</a> class and check the return types for both 'getBook' and 'getBookChapter' methods. BookStoreNoAnnotations.getBookChapter() method's return type is <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/ChapterNoAnnotations.java" rel="nofollow">org.apac
 he.cxf.systest.jaxrs.ChapterNoAnnotations</a> 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.</p><p>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.</p><p>You can use a comma-separated 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").</p><p>Please also see this <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/resources/resources2.xml" rel="nofollow">model file</a> 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.</p><h2 id="JAX-RSAdvancedFeatures-Configuration">Configuration</h2><p>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.</p><p>Please see this <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml" rel="nofollow">bean</a> Spring configuration file, look at jaxrs server beans with 'bookservice6' and 'bookservice7' names.</p><p>Note that wh
 en 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.<br clear="none">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 s
 ucceed.</p><p>Please have a look at <a shape="rect" class="external-link" href="https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_proxy/WEB-INF/beans.xml" rel="nofollow">this Spring bean</a>. 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.</p><p>You can also register a model programmatically, for example :</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default">JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
             sf.setAddress("http://localhost:9080/");
 String modelRef = "classpath:/org/apache/cxf/systest/jaxrs/resources/resources2.xml";