蛋蛋在以前搞CXF的时候搞得乱七八糟,在各位大神的帮助下坎坎坷坷地完成了,这里给大家也分享下CXF的WebService服务构建,希望可以给大家带来帮助,现在开始第一节:
1、Apache CXF简介
Apache CXF = Celtix+ XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和XFire 两大开源项目的精华,提供了对 JAX-WS全面的支持,并且提供了多种Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。
CXF 支持多种 Web Services 标准,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和 WS-Security。Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了 JAX-WS API (遵循 JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和 EndPoint 的创建,而不需要 Annotation 注解。CXF 既支持 WSDL 优先开发,也支持从 Java 的代码优先开发模式。容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS API ,支持 Spring 2.0 更加简化的 XML 配置方式,等等。支持二进制和遗留协议:CXF 的设计是一种可插拨的架构,既可以支持 XML ,也可以支持非 XML 的类型绑定,比如:JSON 和 CORBA。
2、CXF依赖包
由于我们创建的是一个简单的WebService服务,并不运行在Tomcat的中,而是要借助jetty容器,所以这里要引入jetty的支持。
asm-3.3.1.jar
commons-codec-1.7.jar
commons-collections-3.2.1.jar
commons-lang-2.6.jar
commons-logging-1.1.1.jar
cxf-2.7.7.jar
geronimo-servlet_3.0_spec-1.0.jar
jetty-continuation-8.1.12.v20130726.jar
jetty-http-8.1.12.v20130726.jar
jetty-io-8.1.12.v20130726.jar
jetty-security-8.1.12.v20130726.jar
jetty-server-8.1.12.v20130726.jar
jetty-util-8.1.12.v20130726.jar
neethi-3.0.2.jar
stax2-api-3.1.1.jar
woodstox-core-asl-4.2.0.jar
wsdl4j-1.6.3.jar
xmlschema-core-2.0.3.jar
3、创建HelloWorld服务
3.1、创建HelloWorld接口
1. package org.webservice.test;
2.
3. import javax.jws.WebMethod;
4. import javax.jws.WebParam;
5. import javax.jws.WebService;
6.
7. /**
8. * WebService服务端接口
9. *
10. */
12. @WebService
13. public interface HelloWorldService {
14.
15. @WebMethod
16. public String sayHello(@WebParam(name="userName")String userName);
17. }
3.1、创建HelloWorld实现类
1. package org.webservice.test.impl;
2. import javax.jws.WebService;
3. import com.tiamaes.webservice.test.HelloWorldService;
4.
5. /**
6. * WebService的具体实现
7. *
8. */
9. @WebService(endpointInterface="org.webservice.test.HelloWorldService",
10. serviceName="helloWorldService")
11. public class HelloWorldServiceImpl implements HelloWorldService {
12.
13. public String syaHello(String userName) {
14. System.out.println("sayHello("+userName+")");
15. return "Hello "+userName;
16. }
17. }
4、创建服务端
4.1、方法一
1. package org.webservice.server;
2.
3. import javax.xml.ws.Endpoint;
4.
5. import orgwebservice.test.HelloWorldService;
6. import org.webservice.test.impl.HelloWorldServiceImpl;
7.
8. /**
9. * WebService服务
10. *
11. */
12. public class HelloWorldServer {
13.
14. public static void main(String[] args) {
15. HelloWorldService service = new HelloWorldServiceImpl();
16. String address = "http://localhost:8080/hello";
17. Endpoint.publish(address, service);
18. }
19. }
20.
21. 只需要在路径中指定端口和路径就可以用Endpoint的publish方法来发布一个WebService服务
4.2、方法二
1. package org.webservice.server;
2.
3. import org.apache.cxf.interceptor.LoggingInInterceptor;
4. import org.apache.cxf.interceptor.LoggingOutInterceptor;
5. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
6.
7. import org.webservice.test.HelloWorldService;
8. import org.webservice.test.impl.HelloWorldServiceImpl;
9.
10. /**
11. * 利用JaxWsServerFactoryBean 创建服务
12. *
13. */
14. public class HelloWorldJAXServer {
15.
16. public static void main(String[] args) {
17. HelloWorldServiceImpl impl = new HelloWorldServiceImpl();
18. JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
19. factory.setAddress("http://localhost:8080/hello");
20. factory.setServiceClass(HelloWorldService.class);
21. factory.setServiceBean(impl);
22. factory.create();
23. }
24. }
Endpint与JaxWsServerFactoryBean的方式二选一,两种方法都可以创建简单的WebService服务
5、创建客户端
5.1、方法一
1. package org.webservice.test.test;
2.
3. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
4. import org.webservice.test.HelloWorldService;
5.
6. /**
7. * JaxWsProxyFactoryBean 客户端
8. *
9. */
10. public class HelloWorldTest {
11.
12. public static void main(String[] args) {
13. JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
14. factory.setServiceClass(HelloWorldService.class);
15. factory.setAddress("http://127.0.0.1:8080/hello?wsdl");
16. HelloWorldService service = (HelloWorldService) factory.create();
17.
18. System.out.println(">>>>>>>>Client: " + service.syaHello("Tom"));
19.
20. }
21. }
22.
23. 这种方式调用需要客户端的接口类与服务端的接口类的报名及接口名称完全一致。
5.1、方法二
1. package org.webservice.test.test;
2.
3. import org.apache.cxf.endpoint.Client;
4. import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
5.
6. /**
7. * JaxWsDynamicClientFactory动态调用,可以不关心接口,只关心方法
8. *
9. */
10. public class HelloWorldDynamicTest {
11.
12. public static void main(String[] args) {
13. JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
14. Client client = dcf.createClient("http://127.0.0.1:8080/hello?wsdl");
15. try {
16. Object[] objs = client.invoke("syaHello", "Tom");
17. System.out.println(objs[0].toString());
18. } catch (Exception e) {
19. e.printStackTrace();
20. }
21. }
22. }