您的位置:首页 > 其它

CXF学习01---开发服务端与客户端

2014-05-02 13:41 190 查看
使用CXF开发Web Service服务端需要两部分:接口和实现类

步骤:

1、开发一个Web Service 业务接口,该接口需要用@WebService注解

2、开发一个Web Service实现类,实现类也需要用@WebService注解

3、添加Jar包,并发布WebService

具体步骤如下:

1、新建Java项目即可,我们用CXF内置的Jetty服务器

2、开发业务接口:

package com.onyas.ws.cxf;

import javax.jws.WebService;

@WebService
public interface HelloWorld {

String sayHi(String name);

}


3、开发实现类

package com.onyas.ws.cxf.impl;

import java.util.Date;

import javax.jws.WebService;

import com.onyas.ws.cxf.HelloWorld;

@WebService(endpointInterface = "com.onyas.ws.cxf.HelloWorld"
,serviceName = "HelloWorldWs")
public class HelloWorldWs implements HelloWorld {

@Override
public String sayHi(String name) {
return "Hello " + name+new Date();
}

}


4、添加Jar包:

这个教程所用的CXF版本为2.7.9,所需要的jar包请看源代码,在最后附有源代码的下载地址,所有cxf版本的下载地址

5、发布服务端:

package onyas;

import javax.xml.ws.Endpoint;

import com.onyas.ws.cxf.HelloWorld;
import com.onyas.ws.cxf.impl.HelloWorldWs;

public class ServerMain {

public static void main(String[] args) {
HelloWorld hw = new HelloWorldWs();
Endpoint.publish("http://127.0.0.1:9999/onyasWS", hw);
System.out.println("WebService已成功发布");
}

}


注意运行服务端以后,不要关在闭服务端

6、打开浏览器,到你所发布的地址去验证,是否发布成功,本教程所发布的地址为:http://127.0.0.1:9999/onyasWS?wsdl,进入这个地址,如果所呈现的结果如下图所示,刚发布成功

<?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://impl.cxf.ws.onyas.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://cxf.ws.onyas.com/" name="HelloWorldWs" targetNamespace="http://impl.cxf.ws.onyas.com/">
<wsdl:import location="http://localhost:9999/onyasWS?wsdl=HelloWorld.wsdl" namespace="http://cxf.ws.onyas.com/" />
- <wsdl:binding name="HelloWorldWsSoapBinding" type="ns1:HelloWorld">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="sayHi">
<soap:operation soapAction="" style="document" />
- <wsdl:input name="sayHi">
<soap:body use="literal" />
</wsdl:input>
- <wsdl:output name="sayHiResponse">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
- <wsdl:service name="HelloWorldWs">
- <wsdl:port binding="tns:HelloWorldWsSoapBinding" name="HelloWorldWsPort">
<soap:address location="http://localhost:9999/onyasWS" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>


服务端开发完毕

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

使用CXF开发Web Service客户端:

1、新建Java项目

2、进入到客户端项目的src目录中,调用CXF提供的wsdl2java工具(把下载的cxf目录下的bin目录配置到path环境变量中),根据WSDL文档生成相应的代码,因为任何语言实现的Web Service,都需要提供并暴露WSDL文档,就是上文所发布的那个地址。

也就是如下:F:\myworkspace\Cxf_Client\src> wsdl2java -frontend jaxws21 http://localhost:9999/onyasWS?wsdl
3、找到wsdl2java所生成的类中,一个继承了Service的类,该类的实例可以当成工厂类来使用。

4、调用Service子类的实例getXXXXport方法,返回远程Web Service的代理。

代码如下所示:

package onyas;

import com.onyas.ws.cxf.HelloWorld;
import com.onyas.ws.cxf.impl.HelloWorldWs;

public class ClentMain {

public static void main(String[] args) {

HelloWorldWs factory = new HelloWorldWs();
//此处返回的只是远程Web Service的代理
HelloWorld hw = factory.getHelloWorldWsPort();
System.out.println(hw.sayHi("Test"));
}

}


5、运行客户端,如果显示“Hello TestFri May 02 13:42:20 CST 2014”,表示运行成功

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

可能出现的错误:

cxf在客户端调用时报这个错误:

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Cannot create a secure XMLInputFactory

at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:171)

at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:94)

at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:240)

at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:210)

at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:103)

at $Proxy29.sayHi(Unknown Source)

at onyas.ClentMain.main(ClentMain.java:13)

同时cxf在服务端报这个错误:

java.lang.RuntimeException: Cannot create a secure XMLInputFactory

解决办法:

原因是少了一个叫woodstox-core-asl-4.2.0.jar的jar包,添加该jar包,并加到add to build path即可(我用的是apache-cxf-2.7.9)

java.lang.NoClassDefFoundError: org/codehaus/stax2/XMLOutputFactory2

解决办法:

原因是少了一个叫stax2-api-3.1.1.jar的jar包,添加该jar包,并加到add to build path即可(我用的是apache-cxf-2.7.9)

注意:要重启服务器端,并且重新生成客户端代码。

代码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐