目錄:
- 概述
- 根據預設配置實作代理用戶端
- 根據JSR 181注解實作代理用戶端
- 根據WSDL自動生成用戶端代碼
- 動态用戶端的實作
[一]、概述
以 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
----> 用戶端調用結束 <----