2、所需CXFJAR,在CXF下载包中均存在
<!-- WebServices Apache CXF --> <dependency> <groupId>cxf</groupId> <artifactId>cxf</artifactId> <version>2.6.2</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>neethi</artifactId> <version>3.0.2</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>jaxb-api</artifactId> <version>2.2.6</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.5</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.2</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>wss4j</artifactId> <version>1.6.7</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>xmlschema-core</artifactId> <version>2.0.3</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>xml-resolver</artifactId> <version>1.2</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>xmlsec</artifactId> <version>1.5.2</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>xmlbeans</artifactId> <version>2.5.0</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>saaj-api</artifactId> <version>1.3.4</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>saaj-impl</artifactId> <version>1.3.18</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>geronimo-activation_1.1_spec</artifactId> <version>1.1</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>geronimo-annotation_1.0_spec</artifactId> <version>1.1.1</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>geronimo-javamail_1.4_spec</artifactId> <version>1.7.1</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>velocity</artifactId> <version>1.7</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency> <dependency> <groupId>cxf</groupId> <artifactId>jaxb-xjc</artifactId> <version>2.2.5</version> <type>jar</type> <properties> <war.bundle>true</war.bundle> </properties> </dependency>
3、服务端接口:
package com.vtradex.training.server.cxf.helloworld; import javax.jws.WebParam; import javax.jws.WebService; import com.vtradex.training.server.cxf.WsConstants; /** * * @author <a href="mailto:[email protected]">潘宁波</a> * @version $Revision: v1.0 $Date: 2012-8-31 $ */ @WebService(name = "HelloWorldService", targetNamespace = WsConstants.NS) public interface HelloWorldService { String say(@WebParam(name="message") String message); }
4、服务端实现类:
package com.vtradex.training.server.cxf.helloworld.impl; import javax.jws.WebService; import com.vtradex.training.server.cxf.WsConstants; import com.vtradex.training.server.cxf.helloworld.HelloWorldService; /** * WebService服务端实现类. * * serviceName与portName属性指明WSDL中的名称, endpointInterface属性指向Interface定义类. * * @author <a href="mailto:[email protected]">潘宁波</a> * @version $Revision: v1.0 $Date: 2012-8-31 $ */ @WebService(serviceName = "HelloWorldService", portName = "HelloWorldServicePort", endpointInterface = "com.vtradex.training.server.cxf.helloworld.HelloWorldService", targetNamespace = WsConstants.NS) public class HelloWorldServiceImpl implements HelloWorldService { @Override public String say(String message) { return "Hello, " + message; } }
5、常量定义类:
package com.vtradex.training.server.cxf; /** * WebService常量定义. * * @author <a href="mailto:[email protected]">潘宁波</a> * @version $Revision: v1.0 $Date: 2012-8-31 $ */ public class WsConstants { /**项目内统一的NameSpace定义, for SOAP.*/ public static final String NS = "http://thorn4.training.vtradex.com"; /**项目内统一的XML charset定义, for REST*/ public static final String CHARSET = ";charset=UTF-8"; }
6、发布服务的 Servlet
package com.vtradex.training.server.cxf.helloworld; import javax.servlet.ServletConfig; import javax.xml.ws.Endpoint; import org.apache.cxf.transport.servlet.CXFNonSpringServlet; import com.vtradex.training.server.cxf.helloworld.impl.HelloWorldServiceImpl; /** * * * @author <a href="mailto:[email protected]">潘宁波</a> * @version $Revision: v1.0 $Date: 2012-9-1 $ */ public class WsServlet extends CXFNonSpringServlet { private static final long serialVersionUID = 1L; @Override protected void loadBus(ServletConfig sc) { super.loadBus(sc); System.out.println("Starting CXF Web Services... HelloWorldServices"); //: http://localhost:8088/training/ws/helloWorldService?wsdl Endpoint.publish("/helloWorldService", new HelloWorldServiceImpl()); } }
7、web.xml
<servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>com.vtradex.training.server.cxf.helloworld.WsServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping>
8、启动Web服务,在浏览器中即可查看WSDL
9、CXF 客户端调用:
package com.vtradex.training.server.cxf.helloworld; import org.apache.cxf.endpoint.Client; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; /** * * * @author <a href="mailto:[email protected]">潘宁波</a> * @version $Revision: v1.0 $Date: 2012-9-1 $ */ public class WsClient { public static void main(String[] args) { /** * 这种方式要求客户端必须依赖服务端 */ // JaxWsProxyFactoryBean bean = new JaxWsProxyFactoryBean(); // bean.setServiceClass(HelloWorldService.class); // bean.setAddress("http://localhost:8088/training/ws/helloWorldService"); // HelloWorldService helloWorldService = (HelloWorldService)bean.create(); // String result = helloWorldService.say("Brofe"); // System.out.println(result); /** * 通过WSDL调用 */ JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance(); Client client = clientFactory.createClient("http://localhost:8088/training/ws/helloWorldService?wsdl"); client.getInInterceptors().add(new LoggingInInterceptor()); client.getOutInterceptors().add(new LoggingOutInterceptor()); Object[] result; try { result = client.invoke("say", "brofe"); System.out.println(result[0]); } catch (Exception e) { e.printStackTrace(); } } }