首先到CXF官網及spring官網下載相關jar架包,這個不多說。webservice是干嘛用的也不多說。
入門例子
模擬新增一個用戶,並返回新增結果,成功還是失敗。

大概的目錄如上,很簡單。
ResultInfo.java
- package com.fei.webservice.user.bean;
- import java.text.MessageFormat;
- import javax.xml.bind.annotation.XmlAccessorType;
- import javax.xml.bind.annotation.XmlAttribute;
- import javax.xml.bind.annotation.XmlType;
- import javax.xml.bind.annotation.XmlAccessType;
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "ResultInfo", namespace = "http://bean.user.webservice.fei.com/")
- public class ResultInfo {
- @XmlAttribute(required = true)
- private String code;
- @XmlAttribute
- private String message;
- public ResultInfo(){
- super();
- }
- public ResultInfo(String code,String message){
- super();
- this.code = code;
- this.message = message;
- }
- public String getCode() {
- return code;
- }
- public String getMessage() {
- return message;
- }
- public void setCode(String code) {
- this.code = code;
- }
- public void setMessage(String message) {
- this.message = message;
- }
- @Override
- public String toString() {
- return MessageFormat
- .format("[code={0},message={1}]",
- code,
- message);
- }
- }
IUserService.java
- package com.fei.webservice.user;
- import javax.jws.WebParam;
- import javax.jws.WebService;
- import com.fei.webservice.user.bean.ResultInfo;
- @WebService
- public interface IUserService {
- ResultInfo createUser(
- @WebParam(name = "name") String name,
- @WebParam(name = "password") String password);
- }
UserService.java
- package com.fei.webservice.user;
- import javax.jws.WebService;
- import com.fei.webservice.user.bean.ResultInfo;
- @WebService(
- endpointInterface = "com.fei.webservice.user.IUserService",
- targetNamespace = "http://user.webservice.fei.com/",
- serviceName = "IUserService")
- public class UserService implements IUserService{
- public final String SUCCESS = "0000";
- public final String FAIL = "1001";
- @Override
- public ResultInfo createUser(String name, String password) {
- //做業務
- System.out.println("新增用戶:name="+name+",password="+password);
- //通知第三方操作結果
- return new ResultInfo(SUCCESS,"用戶新增成功!");
- }
- }
ServerStart.java
- package com.fei;
- import javax.xml.ws.Endpoint;
- import com.fei.webservice.user.UserService;
- public class ServerStart {
- public static void deployService() {
- System.out.println("Server start ……");
- UserService service = new UserService();
- String address = "http://localhost:9000/userService";
- Endpoint.publish(address, service);
- }
- public static void main(String[] args) throws InterruptedException {
- //發布WebService
- deployService();
- System.out.println("server ready ……");
- }
- }
ServerStart.java是用來發布接口的,可以理解為像tomcat那樣啟動后,瀏覽器就可以訪問了。
ClientTest.java
- package com.fei;
- import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
- import com.fei.webservice.user.IUserService;
- public class ClientTest {
- public static void main(String[] args) {
- //調用WebService
- JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
- factory.setServiceClass(IUserService.class);
- factory.setAddress("http://localhost:9000/userService");
- IUserService service = (IUserService) factory.create();
- System.out.println("[result]" + service.createUser("張三", "1111"));
- }
- }
ClientTest.java模擬第三方調用接口。也就是對服務端(ServerStart.java啟動的那個)是否成功,客戶端和服務端的通訊是否OK。
執行ServerStart.java,看到這樣的信息:

啟動OK。接下來,用瀏覽器訪問,看看是否有xml格式的內容。
訪問地址:http://localhost:9000/userService?wsdl

好了,服務端OK了,我們用客戶端來調用服務端的接口,看看效果。
測試方法一:
執行ClientTest.java,控制台顯示如下信息:

可以看到服務端返回了一個結果對象ResultInfo給客戶端,告訴客戶服務端新增用戶成功了。
測試方法二
使用SOUP-UI來測試,自己網上下載。



CXF整合spring
在WEB-INF下新增一個spring-cxf.xml文件(和web.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"
- 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="userService"
- implementor="com.fei.webservice.user.UserService"
- address="/userService" />
- </beans>
web.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="3.0"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/spring-cxf.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>/cxf/*</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
將項目部署到tomcat下,啟動tomcat。
瀏覽器訪問:http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl

測試也有2種方法,和上面一樣,只是改變訪問地址而已,這里就不重復了。
生成wsdl文件
服務端代碼完成,並發布之后,我們需要將接口的信息生成一個wsdl文件,給第三方,第三方拿到wsdl文件后,通過工具生成代碼。
方法一:
最方便,最快捷的辦法。服務端啟動后,瀏覽器訪問時,得到的信息,將網頁另存為,文件的后綴用.wsdl,這樣就得到wsdl文件了。
注意:用這種方法,瀏覽器使用IE,本人試過百度瀏覽器,360瀏覽器,網頁另存時,它會將一些html的標簽也搞出來了。wsdl文件是一個xml格式的文件。
推薦使用方法一,方法二生成的wsdl文件有點問題,不知道是工具的問題還是代碼寫漏了哪些注解配置。
方法二:
使用cxf的java2wsdl.bat工具來生成。
簡單點的:
將classes文件下的com全部copy到cxf工具的bin目錄下。cmd打開DOS窗口切換到bin目錄下,然后使用命令
java2wsdl -cp ./com com.fei.webservice.user.IUserService

自動生成了IUserServiceService.wsdl文件。
麻煩點的:
1.打包,將代碼打包成jar


在桌面上生成一個userservice.jar包,把該包copy到java2wsdl.bat的同目錄下.cmd開打DOS窗口,切換到java2wsdl.bat目錄下。執行命令:
java2wsdl -cp .\userservice.jar com.fei.webservice.user.IUserService
然后在目錄下,會生成一個IUserService.wsdl文件。

驗證wsdl文件
生成了wsdl文件,交給第三方之前,最好驗證一下,使用它能否正確生成代碼。
1.
用記事本或者瀏覽器打開查看wsdl文件,拉到最后,看看wsdl:port name那里是否和通過
http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl訪問得到的一致。
上面介紹wsdl文件的生成用了2中方法。方法一通過IE瀏覽器的另存為得到wsdl文件,我命名為userService.wsdl.方法二通過java2wsdl自動生成的wsdl文件為IUserServiceService.wsdl.
查看userService.wsdl

上面紅色框圈住的部分是我們期待的。
接下來查看IUserServiceService.wsdl文件

發現居然不是我們期待的,本人暫時找不到原因,為何導致這樣。我們就暫時使用方法一來生成wsdl文件吧
2.
通過wsdl2java.bat工具,生成客戶端源碼,看看能否正確生成。
cmd打開DOS窗口,切換到wsdl2java.bat目錄下,使用命令:
wsdl2java -client -server -impl .\userService.wsdl
在同目錄下,會生成代碼

為了方便,查看生成的代碼的結構,我新建一個java項目,把新生成的代碼copy進去。

我們來看看圖上用箭頭指向的那個類。
- package com.fei.webservice.user;
- import java.net.MalformedURLException;
- import java.net.URL;
- import javax.xml.namespace.QName;
- import javax.xml.ws.Service;
- import javax.xml.ws.WebEndpoint;
- import javax.xml.ws.WebServiceClient;
- import com.fei.webservice.user.IUserService;
- /**
- * This class was generated by Apache CXF (incubator) 2.0.4-incubator
- * Sat Jun 28 15:05:37 CST 2014
- * Generated source version: 2.0.4-incubator
- *
- */
- @WebServiceClient(name = "IUserService", targetNamespace = "http://user.webservice.fei.com/", wsdlLocation = "file:./userService.wsdl")
- public class IUserService_Service extends Service {
- public final static URL WSDL_LOCATION;
- public final static QName SERVICE = new QName("http://user.webservice.fei.com/", "IUserService");
- public final static QName UserServicePort = new QName("http://user.webservice.fei.com/", "UserServicePort");
- static {
- URL url = null;
- try {
- url = new URL("file:./userService.wsdl");
- } catch (MalformedURLException e) {
- System.err.println("Can not initialize the default wsdl from file:./userService.wsdl");
- // e.printStackTrace();
- }
- WSDL_LOCATION = url;
- }
- public IUserService_Service(URL wsdlLocation) {
- super(wsdlLocation, SERVICE);
- }
- public IUserService_Service(URL wsdlLocation, QName serviceName) {
- super(wsdlLocation, serviceName);
- }
- public IUserService_Service() {
- super(WSDL_LOCATION, SERVICE);
- }
- /**
- *
- * @return
- * returns UserServicePort
- */
- @WebEndpoint(name = "UserServicePort")
- public IUserService getUserServicePort() {
- return (IUserService)super.getPort(UserServicePort, IUserService.class);
- }
- }
看到了嗎?
@WebServiceClient(name = "IUserService", targetNamespace = "http://user.webservice.fei.com/"
@WebEndpoint(name = "UserServicePort")
特別是UserServicePort一定要和用瀏覽器訪問服務端時界面顯示的那個一樣(上面截圖中用紅色框圈住的那個wsdl:port name = "UserServicePort")
驗證wsdl生成的代碼是否可用
把wsdl文件給第三方之前,一定要確保wsdl文件是沒問題的,生成出來的代碼也是OK的。所以把wsdl文件給第三方之前還有最后一步要做。驗證wsdl生成的代碼是否可用.
看到上面給的目錄結構圖了嗎?我新曾了org.fei.service.UserService.java以及UserServiceTest.java
UserService.java
- package org.fei.service;
- import java.net.URL;
- import com.fei.webservice.user.IUserService;
- import com.fei.webservice.user.IUserService_Service;
- import com.fei.webservice.user.bean.ResultInfo;
- public class UserService {
- private final static String _URL = "http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl";
- //wsdl生成的接口
- private IUserService userService;
- public UserService() {
- try {
- userService = new IUserService_Service(new URL(_URL)).getUserServicePort();
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException("用戶接口初始化連接出錯!",e);
- }
- }
- public boolean addUser(String name,String password){
- boolean isSuccess = false;
- try {
- ResultInfo result = userService.createUser(name, password);
- if("0000".equals(result.getCode())){
- isSuccess = true;
- System.out.println("新增用戶操作結果:成功!");
- }else{
- isSuccess = false;
- System.out.println("新增用戶操作結果:失敗!");
- }
- } catch (Exception e) {
- e.printStackTrace();
- isSuccess = false;
- }
- return isSuccess;
- }
- }
UserServiceTest.java
- package org.fei.service;
- public class UserServiceTest {
- public static void main(String[] args) {
- UserService userService = new UserService();
- userService.addUser("張三", "123");
- }
- }
把服務端tomcat啟動,然后執行UserServiceTest.java看到運行結果:

到這一步,就可以放心把wsdl文件給對方了。
作為服務端,我們需要把wsdl文件給第三方,並告知我們的訪問地址,如本例訪問地址:http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl
原文:http://blog.csdn.net/dream_broken/article/details/35331949
附:cxf生成webservice客戶端
使用步驟如下:
一、下載apache cxf的包,如apache-cxf-2.7.10.zip,地址:cxf.apache.org/download.html
二、解壓apache-cxf-2.7.10.zip至某一目錄,如D:\apache-cxf-2.7.10
三、設置環境變量
1、CXF_HOME=D:\apache-cxf-2.7.10
2、在path后面加上 %CXF_HOME%/bin;
在cmd命令中輸入wsdl2java,如果有提示usage,就表明配置成功
四、運行wsdl2java工具
在cmd命令中輸入:wsdl2java -d D:\\src -client http://api.xxx.cn/xxxAPI/service/auditResBatchQueryService?wsdl
(D:\\src 是客戶端程序代碼所在的目錄,http://api.xxx.cn/xxxAPI/service/auditResBatchQueryService?wsdl 是 定義webservice的地址)
附wsdl2java用法:
wsdl2java -p com -d D:\\src -all xx.wsdl
-p 指定其wsdl的命名空間,也就是要生成代碼的包名:
-d 指定要產生代碼所在目錄
-client 生成客戶端測試web service的代碼
-server 生成服務器啟動web service的代碼
-impl 生成web service的實現代碼
-ant 生成build.xml文件
-all 生成所有開始端點代碼:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
實例:
wsdl2java -p com.wz.interfaces.wsclient -d D:\project\src -client d:\ws\serviceInteface.wsdl
