Apache CXF的前端应用就是作为WebService的消费者,通过给客户端调用的服务.
ApacheCXF前端应用包括5种:
1.JAX-WS前端模式
2.JAX-RS前端模式
3.动态客户端技术
4.Provider/Dispatch服务前端模式
5.简单前端模式(Simple Frontend)
本篇文章包括的内容如下:
1.基于代码优先(Code First)的JAX-WS前端模式(这里简单略过,详情可以查阅Apache CXF 入门)
2.基于WSDL优先(WSDL First)的JAX-WS前端模式
3.简单前端模式(Simple Frontend)
4.Provider/Dispatch服务前端模式
5.CXF动态客户端技术
基于代码优先的Java First
这种前端方式在上一篇Apache CXF 入门中介绍了几种写法,主要是以先代码,后发布服务生产wsdl的形式.在这里就不再重复说明,若不了解的可以查阅Apache CXF 入门一文,相信能让你很容易理解此种方式的实际应用场景.
基于WSDL优先(WSDL First)的JAX-WS前端模式
这种WSDL优先的编程方式主要是通过已经存在的WSDL文档,然后通过CXF提供的wsdl2java工具生成相关的客户端和服务端的程序代码.
使用WSDL2java的用法:
wsdl2java -ant -impl -server -d
-ant:此选项将生成ANT的构建文件build.xml,用于生成代码
-impl:此选项将生成一个服务实现类
-server:此选项将生成一个服务器组件,用于发布并启动服务
-d:此选项可以用来直接生成代码到一个特定的文件夹
就比如说拿上文中通过代码优先方式生成的wsdl文档:
将上面的wsdl内容复制到一个文件中,比如叫做mywsdl.wsdl
将服务器server开启起来,将服务发布出去,确保能访问到服务.之后我们打开CXF的bin目录,可以找到wadl2java.bat工具,这里为了方便,就直接将mywsdl.wsdl放在bin目录下了,在CMD中输入:wsdl2java.bat -d C:\cxftest -ant -impl -server mywsdl.wsdl
最后去就能在指定的目录下找到CXF生成的文件.
可能会发生的异常问题:
上图的问题1是因为server端没有开启服务器,将server发布出去即可.
问题2是cxf对jdk8的支持问题,解决办法是:找到jdk8的安装目录,在jdk下的jre下的lib下添加一个jaxp.properties文件(如果已经有了,那就不用创建了),添加以下内容:
javax.xml.accessExternalSchema = all
注意大小写,最好你就是复制我上面的内容.然后再重新执行一次上面的wsdl2java命令即可.
生成的内容会根据wsdl文档的内容,不过大概的样子都长这样:(我这里是因为编程风格问题,你们按照java的形式就不会像下面这个图,注意一下即可)
稍微打开每一个文档阅读之后,会发现IHelloService_HelloServicePort_Server就是server类,还有像接口类IHelloService,看名字就能看出个所以然了,基本上都不需要做更改,但唯一必须更改的是实现类,比如这里的HelloServiceImpl类,里面的sayHello只返回一个空字符串,我们需要在这里添加逻辑代码.
对于客户端调用有两种方式:
第一种采用cxf的客户端调用,和以前的一样.
factory.setServiceClass(IHelloService.class);
factory.setAddress("http://localhost:9000/HelloWorld");
IHelloService service = (IHelloService) factory.create();
System.out.println("[result]" + service.sayHello("YZR"));
第二种是基于JA-WS的客户端:
package yzr.main;
import java.io.File;
import java.net.URL;
import cxfwebservice.HelloServiceService;
import yzr.interfaces.IHelloService;
public class wsdlClient {
public static void main(String[] args) throws Exception {
File file=new File("wsdl/mywsdl.wsdl");
URL url;
if(file.exists()){
url=file.toURL();
}else{
url=new URL(args[0]);
}
HelloServiceService service=new HelloServiceService(url);
IHelloService s=service.getHelloServicePort();
System.out.println(s.sayHello("YZR"));
}
}
直接将这个类的代码和接口类代码拿过来客户端使用即可.
简单前端模式(Simple Frontend)
与JAX-WS实现模式不同,简单前端模式在开发和部署webService时不提供任何正式的规范或标准,简单前端模式采用简单工厂模式创建服务,工厂组件采用java反射API去动态创建服务组件和客户端组件,这种模式易于使用,不需要任何工具来构建服务.
默认情况下简单前端模式使用JAXB数据绑定.
简单前端模式的服务端使用ServerFactoryBean对象,客户端采用ClientProxyFactoryBean对象.ServerFactoryBean产生一个服务器实例,需要一个服务来和地址公布于服务,通过创建一个Serer,可以提供服务给外部世界.
实例1:简单实用SimpleFrontend案例
服务端:
接口类:
package yzr.interfaces;
import yzr.entity.Article;
public interface BlogManage {
public Article getArticle(String title);
}
实现类:
package yzr.service;
import yzr.entity.Article;
import yzr.interfaces.BlogManage;
public class BlogManageImpl implements BlogManage {
@Override
public Article getArticle(String title) {
Article art=new Article(title);
art.setContent("测试");
return art;
}
}
实体类:
package yzr.entity;
import java.io.Serializable;
public class Article implements Serializable{
/**
*
*/
private static final long serialVersionUID = 5354767599482895519L;
private String title;
private String content;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "Article [title=" + title + ", content=" + content + "]";
}
public Article(){}
public Article(String title){
this.title=title;
}
}
package yzr.main;
import org.apache.cxf.frontend.ServerFactoryBean;
import yzr.interfaces.BlogManage;
import yzr.service.BlogManageImpl;
public class simpledeploy {
public static void main(String[] args) {
BlogManage blogManage=new BlogManageImpl();
ServerFactoryBean svrFactroy=new ServerFactoryBean();
svrFactroy.setServiceClass(BlogManage.class);
svrFactroy.setAddress("http://localhost:9000/BlogManage");
svrFactroy.setServiceBean(blogManage);
svrFactroy.create();
System.out.println("服务启动成功");
}
}
package yzr.main;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
import yzr.interfaces.BlogManage;
public class ClientProxyFactory {
public static void main(String[] args) {
ClientProxyFactoryBean factory=new ClientProxyFactoryBean();
factory.setServiceClass(BlogManage.class);
if(args!=null && args.length>0 && !"".equals(args[0])){
factory.setAddress(args[0]);
}else{
factory.setAddress("http://localhost:9000/BlogManage");
}
BlogManage blogManage=(BlogManage)factory.create();
System.out.println(blogManage.getArticle("YZR"));
}
}
需要服务端提供接口类和实体类.(BlogManage和Article)
web.xml:
cxfService
contextConfigLocation
classpath*:applicationContext-server.xml
org.springframework.web.context.ContextLoaderListener
CXFService
org.apache.cxf.transport.servlet.CXFServlet
CXFService
/*
Spring配置文件:applicationContext-server.xml:
package yzr.main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import yzr.interfaces.BlogManage;
public class simpleClient {
public static void main(String[] args) {
//CXF方式
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"/yzr/main/CXFSimpleClient-beans.xml"});
BlogManage service2=(BlogManage)context.getBean("client");
System.out.println(service2.getArticle("YZR"));
}
}
CXFSimpleClient-beans.xml的内容如下:
Provider/Dispatch服务前端模式
采用DOMSource(message)的Provider/Dispatch前端模式实现
主要处理大型的,复杂的XML文件
服务端server:
package yzr.main;
import javax.xml.ws.Endpoint;
public class Server2 {
protected Server2() throws Exception {
System.out.println("Starting HelloWorld");
Object implementor = new GreeterDOMSourceMessageProvider();
String address = "http://localhost:9000/HelloWorld";
Endpoint.publish(address, implementor);
}
public static void main(String args[]) throws Exception {
new Server2();
System.out.println("Server ready...");
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting");
System.exit(0);
}
}
package yzr.main;
import java.io.InputStream;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.dom.DOMSource;
import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceProvider;
@WebServiceProvider(portName = "HelloPort", serviceName = "HelloService",
targetNamespace = "http://yzr.interfaces/IHelloService")
@ServiceMode(value=Service.Mode.MESSAGE)
public class GreeterDOMSourceMessageProvider implements Provider {
@Override
public DOMSource invoke(DOMSource request) {
DOMSource response = new DOMSource();
try {
MessageFactory factory = MessageFactory.newInstance();
SOAPMessage soapReq = factory.createMessage();
soapReq.getSOAPPart().setContent(request);
System.out.println("Incoming Client Request as a DOMSource data in MESSAGE Mode");
System.out.println("aaa");
soapReq.writeTo(System.out);
System.out.println("bbb");
System.out.println("\n");
InputStream is = getClass().getResourceAsStream("/yzr/main/GreetMeDocLiteralResp2.xml");
SOAPMessage greetMeResponse = factory.createMessage(null, is);
is.close();
response.setNode(greetMeResponse.getSOAPPart());
} catch (Exception ex) {
ex.printStackTrace();
}
return response;
}
public GreeterDOMSourceMessageProvider(){}
}
Hi YZR1
Hi YZR2
Hi YZR3
Hi YZR4
Hi YZR5
this content
public static void main(String args[]) throws Exception {
/*
if (args.length == 0) {
System.out.println("please specify wsdl");
System.exit(1);
}
URL wsdlURL;
File wsdlFile = new File(args[0]);
if (wsdlFile.exists()) {
wsdlURL = wsdlFile.toURI().toURL();
} else {
wsdlURL = new URL(args[0]);
}
*/
URL wsdlURL=new URL("http://localhost:9000/HelloWorld?wsdl");
MessageFactory factory = MessageFactory.newInstance();
System.out.println(wsdlURL + "\n\n");
QName serviceName2 = new QName("http://yzr.interfaces/IHelloService", "HelloService");
QName portName2 = new QName("http://yzr.interfaces/IHelloService", "HelloPort");
HelloService service2 = new HelloService(wsdlURL, serviceName2);
InputStream is2 = Client.class.getResourceAsStream("/yzr/main/GreetMeDocLiteralReq2.xml");
if (is2 == null) {
System.err.println("Failed to create input stream from file "
+ "GreetMeDocLiteralReq2.xml, please check");
System.exit(-1);
}
SOAPMessage soapReq2 = factory.createMessage(null, is2);
DOMSource domReqMessage = new DOMSource(soapReq2.getSOAPPart());
Dispatch dispDOMSrcMessage = service2.createDispatch(portName2,
DOMSource.class, Mode.MESSAGE);
System.out.println("Invoking server through Dispatch interface using DOMSource in MESSAGE Mode");
DOMSource domRespMessage = dispDOMSrcMessage.invoke(domReqMessage);
System.out.println("Response from server: "
+ domRespMessage.getNode().getLastChild().getTextContent());
System.exit(0);
}
package cxfwebservice;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class HelloService extends Service {
public HelloService(URL wsdlDocumentLocation, QName serviceName) {
super(wsdlDocumentLocation, serviceName);
}
public HelloService() {
super(null, null);
}
public HelloService(URL wsdlDocumentLocation) {
super(wsdlDocumentLocation, null);
}
}
Param
采用DOMSource(Payload)的Provider/Dispatch前端模式实现
主要处理大型的,复杂的XML文件.
代码与上面的DOMSource
package yzr.main;
import javax.xml.ws.Endpoint;
public class Server2 {
protected Server2() throws Exception {
System.out.println("Starting HelloWorld2");
Object implementor = new GreeterDOMSourcePayloadProvider();
String address = "http://localhost:9000/HelloWorld2";
Endpoint.publish(address, implementor);
/*
System.out.println("Starting HelloWorld");
Object implementor = new GreeterDOMSourceMessageProvider();
String address = "http://localhost:9000/HelloWorld";
Endpoint.publish(address, implementor);
*/
}
public static void main(String args[]) throws Exception {
new Server2();
System.out.println("Server ready...");
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting");
System.exit(0);
}
}
GreeterDOMSourcePayloadProvider类:
package yzr.main;
import java.io.InputStream;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.ws.Provider;
import javax.xml.ws.WebServiceProvider;
@WebServiceProvider(portName = "HelloPort2", serviceName = "HelloService2",
targetNamespace = "http://yzr.interfaces/IHelloService")
public class GreeterDOMSourcePayloadProvider implements Provider {
public GreeterDOMSourcePayloadProvider() {
//Complete
}
public DOMSource invoke(DOMSource request) {
DOMSource response = new DOMSource();
try {
System.out.println("Incoming Client Request as a DOMSource data in PAYLOAD Mode");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
StreamResult result = new StreamResult(System.out);
transformer.transform(request, result);
System.out.println("\n");
InputStream is = getClass().getResourceAsStream("/yzr/main/GreetMeDocLiteralResp3.xml");
SOAPMessage greetMeResponse = MessageFactory.newInstance().createMessage(null, is);
is.close();
response.setNode(greetMeResponse.getSOAPBody().extractContentAsDocument());
} catch (Exception ex) {
ex.printStackTrace();
}
return response;
}
}
响应的GreetMeDocLiteralResp3.xml:
DOMSource Payload Provider
package yzr.main;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.dom.DOMSource;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service.Mode;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import cxfwebservice.HelloService;
public final class Client2 {
private Client2() {
}
public static void main(String args[]) throws Exception {
/*
if (args.length == 0) {
System.out.println("please specify wsdl");
System.exit(1);
}
URL wsdlURL;
File wsdlFile = new File(args[0]);
if (wsdlFile.exists()) {
wsdlURL = wsdlFile.toURI().toURL();
} else {
wsdlURL = new URL(args[0]);
}
*/
/*
//DOMSource
URL wsdlURL=new URL("http://localhost:9000/HelloWorld?wsdl");
MessageFactory factory = MessageFactory.newInstance();
System.out.println(wsdlURL + "\n\n");
QName serviceName2 = new QName("http://yzr.interfaces/IHelloService", "HelloService");
QName portName2 = new QName("http://yzr.interfaces/IHelloService", "HelloPort");
HelloService service2 = new HelloService(wsdlURL, serviceName2);
InputStream is2 = Client.class.getResourceAsStream("/yzr/main/GreetMeDocLiteralReq2.xml");
if (is2 == null) {
System.err.println("Failed to create input stream from file "
+ "GreetMeDocLiteralReq2.xml, please check");
System.exit(-1);
}
SOAPMessage soapReq2 = factory.createMessage(null, is2);
DOMSource domReqMessage = new DOMSource(soapReq2.getSOAPPart());
Dispatch dispDOMSrcMessage = service2.createDispatch(portName2,
DOMSource.class, Mode.MESSAGE);
System.out.println("Invoking server through Dispatch interface using DOMSource in MESSAGE Mode");
DOMSource domRespMessage = dispDOMSrcMessage.invoke(domReqMessage);
System.out.println("Response from server: "
+ domRespMessage.getNode().getLastChild().getTextContent());
*/
//DOMSource(payload)
URL wsdlURL=new URL("http://localhost:9000/HelloWorld2?wsdl");
System.out.println(wsdlURL + "\n\n");
QName serviceName3 = new QName("http://yzr.interfaces/IHelloService", "HelloService2");
QName portName3 = new QName("http://yzr.interfaces/IHelloService", "HelloPort2");
HelloService service3 = new HelloService(wsdlURL, serviceName3);
InputStream is3 = Client.class.getResourceAsStream("/yzr/main/GreetMeDocLiteralReq3.xml");
if (is3 == null) {
System.err.println("Failed to create input stream from file "
+ "GreetMeDocLiteralReq3.xml, please check");
System.exit(-1);
}
SOAPMessage soapReq3 = MessageFactory.newInstance().createMessage(null, is3);
DOMSource domReqPayload = new DOMSource(soapReq3.getSOAPBody().extractContentAsDocument());
Dispatch dispDOMSrcPayload = service3.createDispatch(portName3,
DOMSource.class, Mode.PAYLOAD);
System.out.println("Invoking server through Dispatch interface using DOMSource in PAYLOAD Mode");
DOMSource domRespPayload = dispDOMSrcPayload.invoke(domReqPayload);
System.out.println("Response from server: "
+ fetchElementByName(domRespPayload.getNode(),
"greetMeResponse").getTextContent());
System.exit(0);
}
private static Element fetchElementByName(Node parent, String name) {
Element ret = null;
Node node = parent.getFirstChild();
while (node != null) {
if (node instanceof Element && ((Element)node).getLocalName().equals(name)) {
ret = (Element)node;
break;
}
node = node.getNextSibling();
}
return ret;
}
}
this Param Content
采用SOAPMessage的Provider/Dispatch前端实现
主要处理大型的,复杂的XML文件
server:
package yzr.main;
import javax.xml.ws.Endpoint;
public class Server2 {
protected Server2() throws Exception {
System.out.println("Starting Server");
System.out.println("Starting BlogManage");
Object implementor = new GreeterSoapMessageProvider();
String address = "http://localhost:9000/BlogManage";
Endpoint.publish(address, implementor);
/*
System.out.println("Starting HelloWorld2");
Object implementor = new GreeterDOMSourcePayloadProvider();
String address = "http://localhost:9000/HelloWorld2";
Endpoint.publish(address, implementor);
*/
/*
System.out.println("Starting HelloWorld");
Object implementor = new GreeterDOMSourceMessageProvider();
String address = "http://localhost:9000/HelloWorld";
Endpoint.publish(address, implementor);
*/
}
public static void main(String args[]) throws Exception {
new Server2();
System.out.println("Server ready...");
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting");
System.exit(0);
}
}
GreeterSoapMessageProvider类:
package yzr.main;
import java.io.InputStream;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceProvider;
@WebServiceProvider(portName = "BlogManagePort", serviceName = "BlogManage",
targetNamespace = "http://interfaces.yzr/",
wsdlLocation = "/yzr/main/hello_world3.wsdl")//wsdlLocation只作为前端网页解释说明作用,就是在网页上访问http://localhost:9000/BlogManage?wsdl时显示的内容
@ServiceMode(value = Service.Mode.MESSAGE)
public class GreeterSoapMessageProvider implements Provider {
public GreeterSoapMessageProvider() {
//Complete
}
public SOAPMessage invoke(SOAPMessage request) {
SOAPMessage response = null;
try {
System.out.println("Incoming Client Request as a SOAPMessage");
MessageFactory factory = MessageFactory.newInstance();
//传入的XML
request.writeTo(System.out);
InputStream is = getClass().getResourceAsStream("/yzr/main/GreetMeDocLiteralResp1.xml");
response = factory.createMessage(null, is);
is.close();
} catch (Exception ex) {
ex.printStackTrace();
}
return response;
}
}
GreetMeDocLiteralResp1.xml:
Hi YZR
package yzr.main;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.dom.DOMSource;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import javax.xml.ws.Service.Mode;
import javax.xml.ws.soap.SOAPBinding;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import cxfwebservice.HelloService;
import yzr.interfaces.BlogManage;
public final class Client2 {
private Client2() {
}
public static void main(String args[]) throws Exception {
/*
if (args.length == 0) {
System.out.println("please specify wsdl");
System.exit(1);
}
URL wsdlURL;
File wsdlFile = new File(args[0]);
if (wsdlFile.exists()) {
wsdlURL = wsdlFile.toURI().toURL();
} else {
wsdlURL = new URL(args[0]);
}
*/
URL wsdlURL=new URL("http://localhost:9000/BlogManage?wsdl");
MessageFactory factory = MessageFactory.newInstance();
System.out.println(wsdlURL + "\n\n");
QName serviceName1 = new QName("http://interfaces.yzr/", "BlogManage");
QName portName1 = new QName("http://interfaces.yzr/", "BlogManagePort");
HelloService service1 = new HelloService(wsdlURL, serviceName1);
InputStream is1 = Client.class.getResourceAsStream("/yzr/main/GreetMeDocLiteralReq1.xml");
if (is1 == null) {
System.err.println("Failed to create input stream from file "
+ "GreetMeDocLiteralReq1.xml, please check");
System.exit(-1);
}
SOAPMessage soapReq1 = factory.createMessage(null, is1);
Dispatch dispSOAPMsg = service1.createDispatch(portName1,
SOAPMessage.class, Mode.MESSAGE);
System.out.println("Invoking server through Dispatch interface using SOAPMessage");
SOAPMessage soapResp = dispSOAPMsg.invoke(soapReq1);
System.out.println("Response from server: " + soapResp.getSOAPBody().getTextContent());
/*
//DOMSource
URL wsdlURL=new URL("http://localhost:9000/HelloWorld?wsdl");
MessageFactory factory = MessageFactory.newInstance();
System.out.println(wsdlURL + "\n\n");
QName serviceName2 = new QName("http://yzr.interfaces/IHelloService", "HelloService");
QName portName2 = new QName("http://yzr.interfaces/IHelloService", "HelloPort");
HelloService service2 = new HelloService(wsdlURL, serviceName2);
InputStream is2 = Client.class.getResourceAsStream("/yzr/main/GreetMeDocLiteralReq2.xml");
if (is2 == null) {
System.err.println("Failed to create input stream from file "
+ "GreetMeDocLiteralReq2.xml, please check");
System.exit(-1);
}
SOAPMessage soapReq2 = factory.createMessage(null, is2);
DOMSource domReqMessage = new DOMSource(soapReq2.getSOAPPart());
Dispatch dispDOMSrcMessage = service2.createDispatch(portName2,
DOMSource.class, Mode.MESSAGE);
System.out.println("Invoking server through Dispatch interface using DOMSource in MESSAGE Mode");
DOMSource domRespMessage = dispDOMSrcMessage.invoke(domReqMessage);
System.out.println("Response from server: "
+ domRespMessage.getNode().getLastChild().getTextContent());
*/
/*
//DOMSource(payload)
URL wsdlURL=new URL("http://localhost:9000/HelloWorld2?wsdl");
System.out.println(wsdlURL + "\n\n");
QName serviceName3 = new QName("http://yzr.interfaces/IHelloService", "HelloService2");
QName portName3 = new QName("http://yzr.interfaces/IHelloService", "HelloPort2");
HelloService service3 = new HelloService(wsdlURL, serviceName3);
InputStream is3 = Client.class.getResourceAsStream("/yzr/main/GreetMeDocLiteralReq3.xml");
if (is3 == null) {
System.err.println("Failed to create input stream from file "
+ "GreetMeDocLiteralReq3.xml, please check");
System.exit(-1);
}
SOAPMessage soapReq3 = MessageFactory.newInstance().createMessage(null, is3);
DOMSource domReqPayload = new DOMSource(soapReq3.getSOAPBody().extractContentAsDocument());
Dispatch dispDOMSrcPayload = service3.createDispatch(portName3,
DOMSource.class, Mode.PAYLOAD);
System.out.println("Invoking server through Dispatch interface using DOMSource in PAYLOAD Mode");
DOMSource domRespPayload = dispDOMSrcPayload.invoke(domReqPayload);
System.out.println("Response from server: "
+ fetchElementByName(domRespPayload.getNode(),
"greetMeResponse").getTextContent());
*/
System.exit(0);
}
private static Element fetchElementByName(Node parent, String name) {
Element ret = null;
Node node = parent.getFirstChild();
while (node != null) {
if (node instanceof Element && ((Element)node).getLocalName().equals(name)) {
ret = (Element)node;
break;
}
node = node.getNextSibling();
}
return ret;
}
}
GreetMeDocLiteralReq1.xml:
XXX
This XML file does not appear to have any style information associated with it. The document tree is shown below.
WebService客户端通常使用服务接口来调用服务方法,在有些情况下,需要提供一个在运行时动态生成的客户端,由于动态客户端动态检查WSDL,并在WSDL定义基础上动态的创建客户端输入和输出对象,它也验证WSDL文件和输入输出消息格式,但实际上动态客户端并没有调用web服务作为单元测试环境的一部分.
更多案例,读者自行查看下载下来自带的cxf案例吧
案列代码下载:点击