构建基于CXF的WebService服务(1)--创建HelloWorld服务
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依赖包
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接口
package com.tiamaes.webservice.test; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; /** * <p>类描述: WebService服务端接口</p> * <p>修改人:Jaune </p> * <p>修改时间:2014-5-8 上午11:54:38 </p> * <p>修改备注: </p> * @version */ @WebService public interface HelloWorldService { @WebMethod public String syaHello(@WebParam(name="userName")String userName); }
@WebMethod 标注要暴露的方法 @WebParam要暴露的参数
3.2创建HelloWorld实现类
package com.tiamaes.webservice.test.impl; import javax.jws.WebService; import com.tiamaes.webservice.test.HelloWorldService; /** * <p>类描述: WebService的具体实现 </p> * <p>修改人:Jaune </p> * <p>修改时间:2014-5-8 上午11:56:09 </p> * @version */ @WebService(endpointInterface="com.tiamaes.webservice.test.HelloWorldService",serviceName="helloWorldService") public class HelloWorldServiceImpl implements HelloWorldService { /* (non-Javadoc) * @see com.tiamaes.webservice.test.HelloWorldService#syaHello(java.lang.String) */ public String syaHello(String userName) { System.out.println("HelloWorldServiceImpl.sayHello("+userName+")"); return "Hello "+userName; } }实现也需要加上@WebService注解,并且在endpointInterface中指定接口类。
4、创建服务端
4.1、方法一
package com.tiamaes.webservice.server; import javax.xml.ws.Endpoint; import com.tiamaes.webservice.test.HelloWorldService; import com.tiamaes.webservice.test.impl.HelloWorldServiceImpl; /** * <p>类描述: WebService服务 </p> * <p>修改人:Jaune </p> * <p>修改时间:2014-5-8 上午11:59:02 </p> * @version */ public class HelloWorldServer { public static void main(String[] args) { HelloWorldService service = new HelloWorldServiceImpl(); String address = "http://localhost:8080/hello"; Endpoint.publish(address, service); } }
只需要在路径中指定端口和路径就可以用Endpoint的publish方法来发布一个WebService服务
4.2、方法二
package com.tiamaes.webservice.server; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import com.tiamaes.webservice.test.HelloWorldService; import com.tiamaes.webservice.test.impl.HelloWorldServiceImpl; /** * <p>类描述: 利用JaxWsServerFactoryBean 创建服务 </p> * <p>修改人:Jaune </p> * <p>修改时间:2014-5-10 上午08:55:05 </p> * @version */ public class HelloWorldJAXServer { public static void main(String[] args) { HelloWorldServiceImpl impl = new HelloWorldServiceImpl(); JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); factory.setAddress("http://localhost:8080/hello"); factory.setServiceClass(HelloWorldService.class); factory.setServiceBean(impl); factory.create(); } }Endpint与JaxWsServerFactoryBean的方式二选一,两种方法都可以创建简单的WebService服务
5、创建客户端
5.1、方法一
package com.tiamaes.webservice.test.test; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import com.tiamaes.webservice.test.HelloWorldService; /** * <p>类描述: </p> * <p>修改人:Jaune </p> * <p>修改时间:2014-5-8 下午02:22:48 </p> * @version */ public class HelloWorldTest { public static void main(String[] args) { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(HelloWorldService.class); factory.setAddress("http://127.0.0.1:8080/hello?wsdl"); HelloWorldService service = (HelloWorldService) factory.create(); System.out.println(">>>>>>>>Client: " + service.syaHello("Tom")); } }这种方式调用需要客户端的接口类与服务端的接口类的报名及接口名称完全一致。
5.1、方法二
package com.tiamaes.webservice.test.test; import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; /** * <p>类描述: JaxWsDynamicClientFactory动态调用,可以不关心接口,只关心方法 </p> * <p>修改人:Jaune </p> * <p>修改时间:2014-5-10 上午09:09:46 </p> * @version */ public class HelloWorldDynamicTest { public static void main(String[] args) { JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient("http://127.0.0.1:8080/hello?wsdl"); try { Object[] objs = client.invoke("syaHello", "Tom"); System.out.println(objs[0].toString()); } catch (Exception e) { e.printStackTrace(); } } }