CXF includes an "HTTP binding" which makes it easy to build REST style services. The HTTP binding allows you to take any operation and map it to arbitrary URIs and HTTP verbs (i.e. GET, PUT, POST, DELETE).
Info |
---|
This binding has been deprecated and is likely to be removed from CXF in one of its future releases. |
Convention based services
...
Note | ||
---|---|---|
| ||
The |
Using CXF's convention based mapping, a set of resources will be created and mapped to these operations.
...
That's straightforward enough. We see "get", we map it to a GET operation. Then people is extracted from the operation name and turned into a simple URI. Accessing http://server/people would result in a document like so:
...
This will allow users to do a POST to the /customers URI with their document and add it to the collection of customers contained there.
Example with multiple arguments
To use multiple arguments, the @WebParam annotation has to be used to map the parameters of the url to the service parameters.
For example:
Code Block | ||||
---|---|---|---|---|
| ||||
@Get
@HttpResource(location="/customers/{first}/{last}")
void findCustomer(@WebParam(name="first") String firstName, @WebParam(name="last") String lastName);
|
Configuring the Service
Configuration for JRA style services is exactly the same as the convention based services. However, in this example, the service is not in "wrapped" mode. So the configuration is slightly different as we don't need to explicitly set the wrapped setting:
Code Block | ||||
---|---|---|---|---|
| ||||
JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
sf.setServiceClass(CustomerService.class);
sf.setBindingFactory(new HttpBindingInfoFactoryBean());
sf.setAddress("http://localhost:9001/");
CustomerService customerService = new CustomerServiceImpl();
sf.getServiceFactory().setInvoker(new BeanInvoker(customerService));
Server svr = sf.create();
|
Configuring the service in container with Spring configuration file.
web.xml
Code Block | ||||
---|---|---|---|---|
| ||||
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/beans.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
|
beans.xml
Code Block | ||||
---|---|---|---|---|
| ||||
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml"/> <import resource="classpath:META-INF/cxf/cxf-extension-http-binding.xml"/> <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> <jaxws:endpoint id="userService" implementor="org.apache.cxf.CustomerServiceImpl" address="/customerService" bindingUri="http://apache.org/cxf/binding/http"> <jaxws:serviceFactory> <bean class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"> <property name="wrapped" value="true" /> </bean> </jaxws:serviceFactory> </jaxws:endpoint> </beans> |
Info | ||
---|---|---|
| ||
The JaxWsServiceFactoryBean is not resusable across various services. |
Wrapped vs. Unwrapped Mode
...