CXF用JDK注解的方式发布WebService简单例子
CXF用JDK注解的方式发布WebService简单例子
1. 新建工程,导入CXF相关包:
- cxf-2.4.2.jar
- jetty-continuation-7.4.5.v20110725.jar
- jetty-http-7.4.5.v20110725.jar
- jetty-io-7.4.5.v20110725.jar
- jetty-security-7.4.5.v20110725.jar
- jetty-server-7.4.5.v20110725.jar
- jetty-util-7.4.5.v20110725.jar
- neethi-3.0.1.jar
- wsdl4j-1.6.2.jar
- xmlschema-core-2.0.jar
package com.cxf.test; import javax.jws.WebService; @WebService public class UserService { public String addUser(String name, String age) { return "add user with " + name + " and " + age; } public int deleteUser(String id) { return id.length(); } }
这是通过JDK注解的方式。Annotation
3.
发布UserService,代码如下:
package com.cxf.test; import javax.xml.ws.Endpoint; public class DeployUserService { public static void main(String[] args) { Endpoint.publish("http://localhost:9002/user", new UserService()); } }
4.
运行结果如下:
控制台:
2012-9-20 15:12:34 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass 信息: Creating Service {http://test.cxf.com/}UserServiceService from class com.cxf.test.UserService 2012-9-20 15:12:34 org.apache.cxf.endpoint.ServerImpl initDestination 信息: Setting the server's publish address to be http://localhost:9002/user 2012-09-20 15:12:34.659:INFO::jetty-7.4.5.v20110725 2012-09-20 15:12:34.737:INFO::Started SelectChannelConnector@localhost:9002 STARTING 2012-09-20 15:12:34.752:INFO::started o.e.j.s.h.ContextHandler{,null}
访问http://localhost:9002/user?wsdl 查看WS是否发布结果。
<?xml version="1.0" ?> - <wsdl:definitions name="UserServiceService" targetNamespace="http://test.cxf.com/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://test.cxf.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <wsdl:types> - <xsd:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://test.cxf.com/" xmlns:tns="http://test.cxf.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="deleteUser" type="tns:deleteUser" /> - <xsd:complexType name="deleteUser"> - <xsd:sequence> <xsd:element minOccurs="0" name="arg0" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:element name="deleteUserResponse" type="tns:deleteUserResponse" /> - <xsd:complexType name="deleteUserResponse"> - <xsd:sequence> <xsd:element name="return" type="xsd:int" /> </xsd:sequence> </xsd:complexType> <xsd:element name="addUser" type="tns:addUser" /> - <xsd:complexType name="addUser"> - <xsd:sequence> <xsd:element minOccurs="0" name="arg0" type="xsd:string" /> <xsd:element minOccurs="0" name="arg1" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:element name="addUserResponse" type="tns:addUserResponse" /> - <xsd:complexType name="addUserResponse"> - <xsd:sequence> <xsd:element minOccurs="0" name="return" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema> </wsdl:types> - <wsdl:message name="addUserResponse"> <wsdl:part element="tns:addUserResponse" name="parameters" /> </wsdl:message> - <wsdl:message name="deleteUserResponse"> <wsdl:part element="tns:deleteUserResponse" name="parameters" /> </wsdl:message> - <wsdl:message name="deleteUser"> <wsdl:part element="tns:deleteUser" name="parameters" /> </wsdl:message> - <wsdl:message name="addUser"> <wsdl:part element="tns:addUser" name="parameters" /> </wsdl:message> - <wsdl:portType name="UserService"> - <wsdl:operation name="deleteUser"> <wsdl:input message="tns:deleteUser" name="deleteUser" /> <wsdl:output message="tns:deleteUserResponse" name="deleteUserResponse" /> </wsdl:operation> - <wsdl:operation name="addUser"> <wsdl:input message="tns:addUser" name="addUser" /> <wsdl:output message="tns:addUserResponse" name="addUserResponse" /> </wsdl:operation> </wsdl:portType> - <wsdl:binding name="UserServiceServiceSoapBinding" type="tns:UserService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> - <wsdl:operation name="deleteUser"> <soap:operation soapAction="" style="document" /> - <wsdl:input name="deleteUser"> <soap:body use="literal" /> </wsdl:input> - <wsdl:output name="deleteUserResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> - <wsdl:operation name="addUser"> <soap:operation soapAction="" style="document" /> - <wsdl:input name="addUser"> <soap:body use="literal" /> </wsdl:input> - <wsdl:output name="addUserResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> - <wsdl:service name="UserServiceService"> - <wsdl:port binding="tns:UserServiceServiceSoapBinding" name="UserServicePort"> <soap:address location="http://localhost:9002/user" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
5.
新建客户端:导入如下包:
- neethi-3.0.1.jar
- cxf-2.4.2.jar
- wsdl4j-1.6.2.jar
- xmlschema-core-2.0.jar
6. 定制客户端调用WebService的接口,这个接口中的方法签名和参数信息可以从wsdl中的内容看到,代码如下:
package com.cxf.test; import javax.jws.WebService; @WebService public interface IUser { String addUser(String name, String age); int deleteUser(String id); }
7. 编写客户端调用WebService代码
package com.cxf.test; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; public class UserServiceClient { public static void main(String[] args) { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setAddress("http://localhost:9002/user"); factory.setServiceClass(IUser.class); IUser user = (IUser) factory.create(); System.out.println(user.addUser("hello", "world")); System.out.println(user.deleteUser("ssss")); } }
8. 运行结果如下:
2012-9-20 15:14:36 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass 信息: Creating Service {http://test.cxf.com/}IUserService from class com.cxf.test.IUser add user with hello and world 4