CXF與Spring整合
WebService的主要目標是跨平臺的可互操作性。為了達到這一目標,WebService完全基於XML(可擴充套件標記語言)、XSD(XMLSchema)等獨立於平臺、獨立於軟體供應商的標準,是建立可互操作的、分散式應用程式的新平臺。簡單的說WebService就是一個應用程式,它向外界提供了一個能夠通過Web進行呼叫的API。這就是說,你能夠用程式設計的方法通過Web呼叫來實現某個功能的應用程式。
CXF一個Apache開源的WebService框架,它實現了JCP與Web Service中一些重要標準。CXF簡化了構造,整合,面向服務架構(SOA)業務元件與技術的靈活複用。SOA(Service-Oriented Architecture)面向服務架構是一種思想,它將應用程式的不同功能單元通過中立的契約(獨立於硬體平臺、作業系統和程式語言聯絡起來,使得各種形式的功能單元更好的整合。目前來說,WebService 是SOA 的一種較好的實現方式,WebService 採用HTTP 作為傳輸協議,SOAP(Simple Object Access Protocol)作為傳輸訊息的格式。
在CXF中,Service使用WSDL標準定義並能夠使用各種不同的訊息 格式(或binding)和網路協議(transports)包括SOAP、XML(通過HTTP或JMS)進行訪問。CXF同樣支援多種model 如:JAX-WS,JBI,SCA和CORBA service。CXF設計成可靈活部署到各種容器中包括Spring-based,JBI,SCA, Servlet和J2EE容器。
熟悉了WebService的基礎知識之後,入門CXF框架比較簡單。CXF與Spring進行整合使用,大大的簡化了開發工作。下面就拿HelloWorld來介紹CXF及WebService的基礎性東西;
一、環境說明
1、Spring的環境搭建,這裡就不在說了。這裡使用的spring2.5
2、下載CXF,這裡使用最新版本apache-cxf-2.6.2
二 搭建CXF並與Spring進行整合
1、所需的CXF的jar
2、配置web.xml檔案
Java程式碼
- <!--配置CXFServlet begin-->
- <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可自定義配置,用於CXFServlet請求地址攔截,訪問會用到 -->
- <url-pattern>/webservice/*</url-pattern>
- </servlet-mapping>
- <!--配置CXFServlet end -->
3、Web 服務的介面定義HelloWorld.java
Java程式碼
- @WebService(serviceName="HelloWorld",targetNamespace=Constants.WS_NAMESPACE)
- public interface HelloWorld {
- @WebMethod
- public String say(@WebParam(name="name")String name);
- @WebMethod
- public String sayHello(@WebParam(name="user")User user);
- @WebMethod
- public List<User> getList(Long id);
- }
4、Web服務介面實現類 HelloWorldImpl.java
Java程式碼
- @Service("HelloWorldImpl")
- public class HelloWorldImpl implements HelloWorld {
- public String say(String name) {
- return name+",您好!";
- }
- public String sayHello(User user) {
- return user.getName()+",您好!";
- }
- public List<User> getList(Long id){
- List<User> list = new ArrayList<User>();
- User user= new User();
- Long sid=1L;
- user.setId(sid);
- user.setName("張三"+sid);
- list.add(user);
- user= new User();
- sid=2L;
- user.setId(sid);
- user.setName("張三"+sid);
- list.add(user);
- return list;
- }
- }
注意:看到很多Web服務介面的實現類標註了 @WebService註解,我在這測試了實現類不標註該註解及@WebMethod正常。還沒有看到具體文件
5、傳遞物件Customer的PO類定義
Java程式碼
- @XmlRootElement(name="User")
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name="User")
- public class User{
- @XmlElement(nillable=true)
- private Long id;
- @XmlElement(nillable=true)
- private String name;
- @XmlElement(nillable=true)
- private int age;
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
這裡使用很多註解,對於這些註解請參考 WebService註解詳細
6、CXF的Spring配置檔案appCtx-cxf.xml
Java程式碼
- <?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" />
- <bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
- <bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
- <!--implementor:指定介面具體實現類,address:隨意配-->
- <jaxws:endpoint id="helloWorld" implementor="#HelloWorldImpl" address="/HelloWorld" >
- <!-- 輸入日誌攔截器 -->
- <jaxws:inInterceptors>
- <ref bean="inMessageInterceptor"/>
- </jaxws:inInterceptors>
- <!-- 輸出日誌攔截器 -->
- <jaxws:outInterceptors>
- <ref bean="outMessageInterceptor"/>
- </jaxws:outInterceptors>
- </jaxws:endpoint>
- <!-- WebService 客戶端 spring 配置檔案cxf與Spring整合,cxf裡提供了一個工廠類org.apache.cxf.jaxws.JaxWsProxyFactoryBean,
- 可以方便實現的呼叫WebService。serviceClass屬性是介面類,address是webService的路徑在其他bean裡如果要呼叫webservice,
- 只要將client這個bean注入到需要使用的bean裡。-->
- <bean id="client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />
- <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
- <property name="serviceClass" value="com.exp.service.outer.HelloWorld" />
- <property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" />
- </bean>
- </beans>
7、執行伺服器
訪問http://localhost:8080/demo/webservice/HelloWorld?wsdl 地址,您會看到很長的XML檔案
看到的XML一大堆,不容易明白。具體解釋參考 WSDL解釋
8、客戶端測試
Java程式碼
- public class HelloWorldClient {
- public static void main(String[] args) {
- ApplicationContext context = new ClassPathXmlApplicationContext(
- new String[] { "classpath*:/config/spring_cfg/appCtx-*.xml" });
- HelloWorld client = (HelloWorld) context.getBean("client");
- System.out.println(client.say("ABC"));
- User user= new User();
- customer.setName("張三");
- System.out.println(client.sayHello(customer));
- List<User> list = client.getList(1L);
- for(User c:list){
- System.out.println(c.getName());
- }
- }
- }