Apache CXF简介
Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。
Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构。它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量级容器中,以及部署在更高级的服务器上,例如 Jboss、IBM? WebSphere? 或 BEA WebLogic。
【转载使用,请注明出处:http://blog.csdn.net/mahoking】
基本环境搭建
下载最新的CXF需要的jar文件,http://cxf.apache.org/download.html或者http://download.csdn.net/detail/ma_hoking/8210349。在这里我们不进行区分,将所有Apache CXF\apache-cxf-3.0.2\lib下的jar文件(不包含子目录下的文件)复制到项目下。在此我们新建一个Java Project项目CXFWebService,将前面所述的jar文件导入项目中。
创建自定义对象
注解:
@XmlRootElement-指定XML根元素名称(可选)
@XmlAccessorType-控制属性或方法序列化 , 四种方案:
- FIELD-对每个非静态,非瞬变属性JAXB工具自动绑定成XML,除非注明XmlTransient
- NONE-不做任何处理
- PROPERTY-对具有set/get方法的属性进行绑定,除非注明XmlTransient
- PUBLIC_MEMBER -对有set/get方法的属性或具有共公访问权限的属性进行绑定,除非注 明XmlTransient
@XmlType-映射一个类或一个枚举类型成一个XML Schema类型
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; /** * 定义对象演示 * @author mahc * */ @XmlRootElement(name="User") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder={"name","loginName","age"}) public class User { //请使用基本属性类型 private String name; private String loginName; private int age; /** * ※ 需要※ 无参数默认构造器 */ public User() { super(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public User(String name, String loginName, Integer age) { this.name = name; this.loginName = loginName; this.age = age; } @Override public String toString() { return "User [name=" + name + ", loginName=" + loginName + ", age=" + age + "]"; } }
构建WebService的接口类
import java.util.List; import javax.jws.WebParam; import javax.jws.WebService; import com.mahaochen.cxf.User; /** * ※@WebService:申明为webservice的注解 * endpointInterface:要暴露的接口类 * serviceName:服务名 * @author mahc * */ @WebService(endpointInterface = "com.mahaochen.cxf.ws.IUserService", serviceName = "UserService") public interface IUserService { /** * ※@WebParam(name = "name"):自定义请求参数的名称 * @param name * @param loginName * @param age * @return */ public User registerUser( @WebParam(name = "name") String name, @WebParam(name = "loginName") String loginName, @WebParam(name = "age") int age); public List<User> getRegistedUsers(); }
注意事项:
如果
@WebService(endpointInterface = "com.mahaochen.cxf.ws.IUserService", serviceName = "UserService")
填写错误会报错:Could not load Webservice SEI。
构建WebService的实现类
import java.util.ArrayList; import java.util.List; import com.mahaochen.cxf.User; public class UserService implements IUserService{ private static List<User> userList = new ArrayList<User>(); @Override public User registerUser(String name, String loginName, int age) { User user = new User(name, loginName, age); userList.add(user); return user; } @Override public List<User> getRegistedUsers() { for(int i=0;i<2;i++){ User tempUser = new User("name"+i, "loginName"+i, 18+i); userList.add(tempUser); } return userList; } }
发布WebService服务
/** * 发布WebServie服务测试类 * @author mahc * */ public class TestCXFWebService { public static void main(String[] args) { System.out.println("CXFWebService is starting!"); IUserService userService = new UserService(); String address = "http://localhost:8090/CXFWebService"; // String testAddress = "http://localhost:8090/CXFWebService?wsdl"; Endpoint.publish(address, userService); System.out.println("CXFWebService is started!"); } }
测试WebService
通过IE浏览器,访问http://localhost:8090/CXFWebService?wsdl。
<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://ws.cxf.mahaochen.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="UserServiceService" targetNamespace="http://ws.cxf.mahaochen.com/"> <wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ws.cxf.mahaochen.com/" elementFormDefault="unqualified" targetNamespace="http://ws.cxf.mahaochen.com/" version="1.0"> <xs:element name="User" type="tns:user"/> <xs:element name="getRegistedUsers" type="tns:getRegistedUsers"/> <xs:element name="getRegistedUsersResponse" type="tns:getRegistedUsersResponse"/> <xs:element name="registerUser" type="tns:registerUser"/> <xs:element name="registerUserResponse" type="tns:registerUserResponse"/> <xs:complexType name="registerUser"> <xs:sequence> <xs:element minOccurs="0" name="name" type="xs:string"/> <xs:element minOccurs="0" name="loginName" type="xs:string"/> <xs:element name="age" type="xs:int"/> </xs:sequence> </xs:complexType> <xs:complexType name="registerUserResponse"> <xs:sequence> <xs:element minOccurs="0" name="return" type="tns:user"/> </xs:sequence> </xs:complexType> <xs:complexType name="user"> <xs:sequence> <xs:element minOccurs="0" name="name" type="xs:string"/> <xs:element minOccurs="0" name="loginName" type="xs:string"/> <xs:element name="age" type="xs:int"/> </xs:sequence> </xs:complexType> <xs:complexType name="getRegistedUsers"> <xs:sequence/> </xs:complexType> <xs:complexType name="getRegistedUsersResponse"> <xs:sequence> <xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="tns:user"/> </xs:sequence> </xs:complexType> </xs:schema> </wsdl:types> <wsdl:message name="registerUserResponse"> <wsdl:part element="tns:registerUserResponse" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="getRegistedUsers"> <wsdl:part element="tns:getRegistedUsers" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="registerUser"> <wsdl:part element="tns:registerUser" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:message name="getRegistedUsersResponse"> <wsdl:part element="tns:getRegistedUsersResponse" name="parameters"> </wsdl:part> </wsdl:message> <wsdl:portType name="IUserService"> <wsdl:operation name="registerUser"> <wsdl:input message="tns:registerUser" name="registerUser"> </wsdl:input> <wsdl:output message="tns:registerUserResponse" name="registerUserResponse"> </wsdl:output> </wsdl:operation> <wsdl:operation name="getRegistedUsers"> <wsdl:input message="tns:getRegistedUsers" name="getRegistedUsers"> </wsdl:input> <wsdl:output message="tns:getRegistedUsersResponse" name="getRegistedUsersResponse"> </wsdl:output> </wsdl:operation> </wsdl:portType> <wsdl:binding name="UserServiceServiceSoapBinding" type="tns:IUserService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="registerUser"> <soap:operation soapAction="" style="document"/> <wsdl:input name="registerUser"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="registerUserResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getRegistedUsers"> <soap:operation soapAction="" style="document"/> <wsdl:input name="getRegistedUsers"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="getRegistedUsersResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="UserServiceService"> <wsdl:port binding="tns:UserServiceServiceSoapBinding" name="UserServicePort"> <soap:address location="http://localhost:8090/CXFWebService"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
测试WebService访问的Client类
import java.util.List; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import com.mahaochen.cxf.User; public class Client { public static void main(String[] args) { JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean(); factoryBean.setServiceClass(IUserService.class); factoryBean.setAddress("http://localhost:8090/CXFWebService"); IUserService userService = (IUserService) factoryBean.create(); User user = userService.registerUser("name", "loginName", 28); user.toString(); List<User> users = userService.getRegistedUsers(); System.out.println(user.toString()); } }
以上是单独部署的方式之一,然而很多情况下,我们并不希望我们的WebService和我们的应用分开成两个服务器,而希望他们在同一个容器,Tomcat或JBOSS或其他的,这样我们就必须通过WEB来部署我们前面完成的webservice。这部分将在下篇博文中介绍,敬请期待!
【转载使用,请注明出处:http://blog.csdn.net/mahoking】