Configuration of JAX-RS endpoints and clients
Configuration of Endpoints
Providing a custom javax.ws.rs.core.Application implementation is the only portable way to register root resource and provider classes and indicate what lifecycle model the individual resources follow. For example:
package server;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class BookApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(BookStore.class);
return classes;
}
@Override
public Set<Object> getSingletons() {
Set<Object> classes = new HashSet<Object>();
classes.add(new SearchService());
classes.add(new BookExceptionMapper());
return classes;
}
}
The BookApplication indicates to the runtime that BookStore root resource has the per-request lifecycle. The SearchService root resource and BookExceptionMapper provider are singletons. In CXF one can register JAX-RS Applications in web.xml using a CXFNonSpringJaxrsServlet:
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>
org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>
server.BookApplication
</param-value>
</init-param>
</servlet>
Spring users can configure the JAX-RS endpoints using one or more jaxrs:server declarations:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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
http://cxf.apache.org/schemas/jaxrs.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource=
"classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<bean class="org.apache.cxf.systest.jaxrs.BookStore" id="serviceBean"/>
<bean class="org.apache.cxf.systest.jaxrs.provider.JAXBElementProvider"
id="jaxbProvider">
<!-- customize the default JAXBElementProvider
by setting some of its properties -->
</bean>
<jaxrs:server id="bookservice" address="/bookstore">
<jaxrs:serviceBeans>
<ref bean="serviceBean" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jaxbProvider"/>
</jaxrs:providers>
<jaxrs:features>
<!-- Register CXF features such as FastInfoset or Logging -->
</jaxrs:features>
<jaxrs:inInterceptors>
<!-- Register CXF in interceptors, example, reuse common in
interceptors between JAX-WS and JAX-RS endpoints -->
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<!-- Register CXF out interceptors, example, reuse common out
interceptors between JAX-WS and JAX-RS endpoints -->
</jaxrs:outInterceptors>
</jaxrs:server>
</beans>
A single JAX-RS endpoint is registered with a jaxrs:server declaration. This declaration may reference multiple root resource beans with jaxrs:serviceBeans and multiple providers using jaxrs:providers. Note a jaxrs:server/@address attribute. It allows for registering multiple jaxrs:server endpoints with all of them referencing the same service beans but using differently configured JAX-RS providers.
The jaxrs:server endpoints can register CXF features, in and out CXF interceptors.
Configuration of Clients
CXF JAX-RS clients can be configured programmatically or from Spring.
Configuring the clients from Spring often implies that the client instances are injected into JAX-RS or JAX-WS endpoints so that the incoming request can be further delegated to the RESTful service. Both proxies and WebClient instances can be configured from Spring:
<jaxrs:client id="restClient"
address="http://localhost:9000/test/services/rest"
serviceClass="server.BookStoreJaxrsJaxws">
<jaxrs:headers>
<entry key="Accept" value="text/xml"/>
</jaxrs:headers>
</jaxrs:client>
<bean id="webClient" class="org.apache.cxf.jaxrs.client.WebClient"
factory-method="create">
<constructor-arg type="java.lang.String"
value="http://localhost:9000/books/" />
</bean>