Inleiding
Apache CXF is gebaseerd op een succesvolle webservice-stack, XFire. Deze pagina laat webservices zien die volgend het code-first principe zijn gebouwd. Voor het bouwen van contract-first webservices bevelen we Spring Webservices aan.
Een CXF Project
Alhoewel er verschillende manieren zijn om een CXF webservice te maken, maken we in dit voorbeeld gebruik van Maven en het archetype cxf-jaxws-javafirst aangezien dit netjes in de Maven plugin voor Eclipse zit ingebakken (Nexus Indexer). Het resultaat is een Eclipse project met de volgende belangrijke files:
- web.xml
- beans.xml
web.xml
<?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>
De web.xml is de standaard J2EE deployment descriptor voor het kunnen deployen van een webapplication (WAR). Deze web.xml verwijst naar de CXFServlet die in staat is om SOAP aanroepen te vertalen (gebruik makend van de annotaties op de class en interface) naar de aanroep van een Java methode. In de web.xml wordt verwezen naar beans.xml, een configuratiebestand van Spring waardoor patterns als Inversion of Control en Dependency Injection kunnen worden toegepast:
<?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-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <jaxws:endpoint id="helloWorldEndpoint" implementor="nl.han.ica.ddoa.workshop.service.HelloWorldImpl" address="/HelloWorld" /> <jaxws:endpoint id="gridServiceEndpoint" implementor="#gridService" address="/GridService"> </jaxws:endpoint> <bean id="gridService" class="nl.han.ica.ddoa.workshop.service.GridServiceImpl"> <property name="gridDAO" ref="gridDAO" /> </bean> <bean id="gridDAO" class="nl.han.ica.ddoa.workshop.dao.GridDAOImpl" /> </beans>
In deze beans,xml staan twee webservice endpoints gedefinieerd. De WSDL is opvraagbaar via http://servernaam:poort/projectnaam/endpointaddress?wsdl, bijvoorbeeld: http://localhost:8080/WSSpringHibernate-0.0.1-SNAPSHOT/GridService?wsdl.
Het vervolgens implementeren van de webservice is betrekkelijk eenvoudig, maak een Java-interface en implementeer deze:
package nl.han.ica.ddoa.workshop.service; import java.util.List; import javax.jws.WebService; import nl.han.ica.ddoa.workshop.domain.Grid; @WebService public interface GridService { List<Grid> getGrids(); }
package nl.han.ica.ddoa.workshop.service; import java.util.List; import javax.jws.WebService; import nl.han.ica.ddoa.workshop.dao.GridDAO; import nl.han.ica.ddoa.workshop.domain.Grid; @WebService(endpointInterface = "nl.han.ica.ddoa.workshop.service.GridService") public class GridServiceImpl implements GridService { private GridDAO gridDAO; public List<Grid> getGrids() { return gridDAO.findAll(); } public GridDAO getGridDAO() { return gridDAO; } public void setGridDAO(GridDAO gridDAO) { this.gridDAO = gridDAO; } }
De implementatie maakt gebruik van een zgn. DataAccessObject (DAO ) die met Spring geinjecteerd wordt.