Happy Coding with Vinay Kumar in techartifact…
Latest tip and information on Java and Oracle Fusion Middleware/Weblogic
In recent times there is lot of growth in RESTFul services. I thought it would be nice to talk about it.
This example is using Apache CXF and Spring. There are some other frameworks e.g Jersey (Reference Sun implementation), RestEasy, the JBoss choice and Apache CXF.
Here is bacic web configuration adding Spring context and CXF tranport servlet.
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/services.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>CXFServlet</servlet-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>/rest/*</url-pattern> </servlet-mapping>
There is Cities service using Spring annotations, this has been configured using Spring annotation
Second annottatiions is of CXF to define the mount point REST service
@Service("timeService") @Path("cities") public class CitiesListingService { @GET @Produces({"application/json", "application/xml"}) public RestFulCities getCities() { List<City> cities = new LinkedList<City>(); cities.add(new City("New Delhi", "011", "19M")); cities.add(new City("Mumbai", "022", "21M")); cities.add(new City("Chennai", "044", "10M")); RestFulCities restFulCities = new RestFulCities(); restFulCities.setRestFulCityList(getCities(cities)); return restFulCities; }
Here is Spring configuration for connection cxf and spring beans together.
<context:component-scan base-package="com.techartifact.example.spring"/> <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"/> <jaxrs:server id="restContainer" address="/"> <jaxrs:serviceBeans> <ref bean="timeService"/> </jaxrs:serviceBeans> <jaxrs:extensionMappings> <entry key="json" value="application/json"/> <entry key="xml" value="application/xml"/> </jaxrs:extensionMappings> <jaxrs:providers> <ref bean="jaxbXmlProvider"/> </jaxrs:providers> </jaxrs:server> <!-- Webservice message handlers --> <bean id="jaxbXmlProvider" class="org.apache.cxf.jaxrs.provider.JAXBElementProvider"> <property name="jaxbElementClassNames" ref="elements"/> </bean> <util:list id="elements"> <value>com.techartifact.example.spring.model.RestFulCity</value> <value>com.techartifact.example.spring.model.RestFulCities</value> </util:list>
Yes that’s it. Now build the code and run it.
Download full example code from here spring-RESTapplication
Go to project directory [spring-RESTapplication] in command shell and run following command using maven
mvn clean package mvn -Pcargo-run
http://localhost:8080/springrest/rest/cities
CXF can also produces output in json format, use following url to see out put in json
http://localhost:8080/springrest/rest/cities.json
In web application ApplicationContext is created using Context Loaders. there are two implementations of context loader.
ContextLoaderListener : It is listener implementation that is added to web.xml file.
ContextLoaderServlet : It is servlet implementation that is configured with load-on-startup tag in web.xml.
ContextLoaderListener is simple way to use the spring in web application. this listener accept contextConfigLocation parameter from context-parama.
You have to enter following code in web.xml file
define contextConfigLocation parameter in context-param tag.
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/services.xml</param-value> </context-param>
services.xml is the Spring configuration file in which you define beans.
Add the ContextLoaderListener listener.
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
Here is the complete source code for the example demonstrating this.
InputService.java
package com.techartifact.example.spring.service; import java.util.Random; import java.util.Scanner; public class InputService { public int getIntValue() { Random r=new Random(); int val=r.nextInt(); System.out.println("Returning value = "+val); return val; } }
OutputService.java
package com.techartifact.example.spring.service; public class OutputService{ public int write(int x) { System.out.println("Output is "+x); return x; } }
CalServlet .java
package com.techartifact.example.spring.servlets; import com.techartifact.example.spring.service.CalcMachine; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CalServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); ApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); CalcMachine cal = (CalcMachine) ac.getBean("cal"); response.getWriter().print("Adding of numbers is = " + cal.doAdd()); response.getWriter().close(); } }
services.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="in" class="com.techartifact.example.spring.service.InputService"/> <bean id="out" class="com.techartifact.example.spring.service.OutputService"/> <bean id="cal" class="com.techartifact.example.spring.service.CalcMachine"> <property name="inputService"> <ref bean="in" /> </property> <property name="outputService"> <ref bean="out" /> </property> </bean> </beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>DI2_web</display-name> <servlet> <description></description> <display-name>CalServlet</display-name> <servlet-name>CalServlet</servlet-name> <servlet-class>com.techartifact.example.spring.servlets.CalServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CalServlet</servlet-name> <url-pattern>/CalServlet</url-pattern> </servlet-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/services.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
Download full example code from here spring-webapplication
Go to project directory [spring-webapplication] in command shell and run following command using maven
mvn clean package mvn -Pcargo-run