天天看點

XFire開發用戶端幾種方式的示例

目錄:

  1. 概述
  2. 根據預設配置實作代理用戶端
  3. 根據JSR 181注解實作代理用戶端
  4. 根據WSDL自動生成用戶端代碼
  5. 動态用戶端的實作

[一]、概述

以 XFire webservice入門開發執行個體 中釋出的服務端為例,WSDL:http://demo.micmiu.com:8080/xfire-base-demo/services/HelloWorldService 。

建立一個用戶端調用的工程:

mvn archetype:create -DgroupId=com.micmiu.xfire.demo -DartifactId=xfire-client-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false      

[二]、根據預設配置實作代理用戶端

首先:編寫一個像之前文章中服務端一樣的服務接口類:HelloWorldService.java

package com.micmiu.xfire.demo.client;

import javax.jws.WebService;

/**
 *
 * @blog http://www.micmiu.com
 * @author Michael
 */
public interface HelloWorldService {

	/**
	 * return welcome
	 * @param username
	 * @return
	 */
	String sayHello(String username);

}
           

用戶端調用測試類:HelloClient4Default.java

package com.micmiu.xfire.demo.client;

import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

/**
 *
 * @blog http://www.micmiu.com
 * @author Michael
 */
public class HelloClient4Default {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		String wsURL = "http://demo.micmiu.com:8080/xfire-base-demo/services/HelloWorldService";
		try {
			System.out.println(" ----> 初始用戶端 <---- ");
			Service serviceModel = new ObjectServiceFactory()
					.create(HelloWorldService.class);

			// Service serviceModel = new ObjectServiceFactory().create(
			// HelloWorldService.class, "HelloWorldService",
			// "http://demo.xfire.micmiu.com/HelloWoldService", null);

			HelloWorldService client = (HelloWorldService) new XFireProxyFactory()
					.create(serviceModel, wsURL);
			System.out.println(client.sayHello("Michael"));
			System.out.println(" ----> 用戶端調用結束 <---- ");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}
           

ps:注意代碼中的 webservice的URL 沒有字尾 ?wsdl

運作日志:

----> 初始用戶端 <----
Hi,Michael welcome,see more http://www.micmiu.com
 ----> 用戶端調用結束 <----      

[三]、根據JSR 181注解實作代理用戶端

修改上面 [一] 中的服務接口類,添加@webService 注解:HelloWorldService.java

package com.micmiu.xfire.demo.client;

import javax.jws.WebService;

/**
 *
 * @blog http://www.micmiu.com
 * @author Michael
 */
@WebService
public interface HelloWorldService {

	/**
	 * return welcome
	 * @param username
	 * @return
	 */
	String sayHello(String username);

}
           

編寫用戶端代碼:HelloClient4JSR181Annotation.java

package com.micmiu.xfire.demo.client;

import org.codehaus.xfire.annotations.AnnotationServiceFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;

/**
 *
 * @blog http://www.micmiu.com
 * @author Michael
 */
public class HelloClient4JSR181Annotation {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		String wsURL = "http://demo.micmiu.com:8080/xfire-base-demo/services/HelloWorldService";
		try {
			System.out.println(" ----> 初始用戶端 <---- ");
			Service serviceModel = new AnnotationServiceFactory()
					.create(HelloWorldService.class);

			HelloWorldService client = (HelloWorldService) new XFireProxyFactory()
					.create(serviceModel, wsURL);
			System.out.println(client.sayHello("Michael"));
			System.out.println(" ----> 用戶端調用結束 <---- ");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}
           

ps:注意代碼中的 webservice的URL 沒有字尾 ?wsdl

運作日志:

----> 初始用戶端 <----
Hi,Michael welcome,see more http://www.micmiu.com
 ----> 用戶端調用結束 <----      

[四]、根據WSDL自動生成用戶端代碼

目錄結構如下:

E:\software code\xFire>tree
├─client-src
│
└─lib      

運用WsGen指令生成代碼:

java -cp .;./lib/* org.codehaus.xfire.gen.WsGen -wsdl http://demo.micmiu.com:8080/xfire-base-demo/services/HelloWorldService?wsdl -o ./client-src -p com.micmiu.xfire.demo.base.client -overwrite true      

參數說明:

  • -wsdl        : 指定wsdl檔案或者URL
  • -o             : 指定輸出目錄
  • -package   : 指定用戶端代碼的包結構
  • -binding    : 指定綁定:jaxb 或 xmlbeans
  • -overwrite : 指定是否覆寫

運作日志:

E:\software code\xFire>java -cp .;./lib/* org.codehaus.xfire.gen.WsGen -wsdl htt
p://demo.micmiu.com:8080/xfire-base-demo/services/HelloWorldService?wsdl -o ./cl
ient-src -p com.micmiu.xfire.demo.base.client -overwrite true
Running WsGen...
wsdl    : http://demo.micmiu.com:8080/xfire-base-demo/services/HelloWorldService
?wsdl
package : com.micmiu.xfire.demo.base.client
output  : ./client-src
binding :
externalBindings :
baseURI :
profile :
explictAnnotation : false
overwrite : true
serverStub : true
forceBare : false
2012-7-30 18:26:22 org.codehaus.xfire.gen.Wsdl11Generator generate
資訊: Generating code for WSDL at http://demo.micmiu.com:8080/xfire-base-demo/se
rvices/HelloWorldService?wsdl with a base URI of http://demo.micmiu.com:8080/xfi
re-base-demo/services/HelloWorldService?wsdl
2012-7-30 18:26:23 org.codehaus.xfire.gen.jsr181.AbstractServiceGenerator genera
te
資訊: Creating class com.micmiu.xfire.demo.base.client.HelloWorldServicePortType

2012-7-30 18:26:23 org.codehaus.xfire.gen.jsr181.AbstractServiceGenerator genera
te
資訊: Creating class com.micmiu.xfire.demo.base.client.HelloWorldServiceImpl
com\micmiu\xfire\demo\hellowoldservice\ObjectFactory.java
com\micmiu\xfire\demo\hellowoldservice\SayHello.java
com\micmiu\xfire\demo\hellowoldservice\SayHelloResponse.java
com\micmiu\xfire\demo\hellowoldservice\package-info.java
com\micmiu\xfire\demo\base\client\HelloWorldServiceClient.java
com\micmiu\xfire\demo\base\client\HelloWorldServiceImpl.java
com\micmiu\xfire\demo\base\client\HelloWorldServicePortType.java
Done.      

用戶端代碼生成後的目錄結構如下:

E:\software code\xFire>tree /F client-src
卷 tools 的檔案夾 PATH 清單
卷序列号為 AA19-63C1
E:\SOFTWARE CODE\XFIRE\CLIENT-SRC
├─com
│  └─micmiu
│      └─xfire
│          └─demo
│              ├─base
│              │  └─client
│              │          HelloWorldServiceClient.java
│              │          HelloWorldServiceImpl.java
│              │          HelloWorldServicePortType.java
│              │
│              └─hellowoldservice
│                      ObjectFactory.java
│                      package-info.java
│                      SayHello.java
│                      SayHelloResponse.java
│
└─META-INF
    └─xfire
            services.xml      

把上面的源代碼copy到項目中即可,編寫測試代碼:HelloWorldGenClientTest.java

package com.micmiu.xfire.demo.base.client;

/**
 *
 * @blog http://www.micmiu.com
 * @author Michael
 */
public class HelloWorldGenClientTest {

	public static void main(String[] args) throws Exception {

		System.out.println(" ----> 初始用戶端 <---- ");
		HelloWorldServiceClient service = new HelloWorldServiceClient();
		HelloWorldServicePortType client = service
				.getHelloWorldServiceHttpPort();

		System.out.println(client.sayHello("Michael"));
		System.out.println(" ----> 用戶端調用結束 <---- ");

	}
}
           

運作結果:

----> 初始用戶端 <----
Hi,Michael welcome,see more http://www.micmiu.com
 ----> 用戶端調用結束 <----      

[五]、動态用戶端的實作

編寫測試代碼:HelloClient4Dynamic.java

package com.micmiu.xfire.demo.client;

import java.net.URL;

import org.codehaus.xfire.client.Client;

/**
 *
 * @blog http://www.micmiu.com
 * @author Michael
 */
public class HelloClient4Dynamic {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		String wsURL = "http://demo.micmiu.com:8080/xfire-base-demo/services/HelloWorldService?wsdl";
		try {
			System.out.println(" ----> 初始用戶端 <---- ");
			Client client = new Client(new URL(wsURL));

			Object[] results = client.invoke("sayHello",
					new Object[] { "Michael" });

			System.out.println(results[0]);
			System.out.println(" ----> 用戶端調用結束 <---- ");
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}      

ps:注意代碼中的 webservice的URL 有字尾 ?wsdl

運作結果:

----> 初始用戶端 <----
Hi,Michael welcome,see more http://www.micmiu.com
 ----> 用戶端調用結束 <----