使用CXF发布和调用webservice之HelloWorld入门
发布时间:2020-12-17 01:13:29 所属栏目:安全 来源:网络整理
导读:?依赖的JAR ????cxf-2.2.10.jar ????jetty-6.1.21.jar ????jetty-util-6.1.21.jar ????servlet-2_5-api.jar ????wsdl4j-1.6.2.jar ????XmlSchema-1.4.5.jar 创建一个普通的Java工程即可 创建webservice接口 package com.cxf.interfaces;import javax.jws.Web
?依赖的JAR 创建webservice接口 package com.cxf.interfaces; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface HelloWorldServiceInf { String sayHello(@WebParam(name="username") String username); } 发布和调用webservice package com.cxf.impl; import javax.jws.WebService; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import com.cxf.interfaces.HelloWorldServiceInf; @WebService(endpointInterface="com.cxf.interfaces.HelloWorldServiceInf",serviceName="helloWorldService") public class Server implements HelloWorldServiceInf { public String sayHello(String username) { return "Hello,"+username; } public static void main(String[] args) { Server impl=new Server(); JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean(); factoryBean.setAddress("http://localhost:9000/hello"); factoryBean.setServiceClass(HelloWorldServiceInf.class); factoryBean.setServiceBean(impl); factoryBean.getInInterceptors().add(new LoggingInInterceptor()); factoryBean.getOutInterceptors().add(new LoggingOutInterceptor()); factoryBean.create(); } } wsdl描述文件 <?xml version="1.0" ?> - <wsdl:definitions name="HelloWorldServiceInfService" targetNamespace="http://interfaces.cxf.com/" xmlns:ns1="http://schemas.xmlsoap.org/wsdl/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://interfaces.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://interfaces.cxf.com/" xmlns:tns="http://interfaces.cxf.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="sayHello" type="tns:sayHello" /> - <xsd:complexType name="sayHello"> - <xsd:sequence> <xsd:element minOccurs="0" name="username" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:element name="sayHelloResponse" type="tns:sayHelloResponse" /> - <xsd:complexType name="sayHelloResponse"> - <xsd:sequence> <xsd:element minOccurs="0" name="return" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema> </wsdl:types> - <wsdl:message name="sayHelloResponse"> <wsdl:part element="tns:sayHelloResponse" name="parameters" /> </wsdl:message> - <wsdl:message name="sayHello"> <wsdl:part element="tns:sayHello" name="parameters" /> </wsdl:message> - <wsdl:portType name="HelloWorldServiceInf"> - <wsdl:operation name="sayHello"> <wsdl:input message="tns:sayHello" name="sayHello" /> <wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse" /> </wsdl:operation> </wsdl:portType> - <wsdl:binding name="HelloWorldServiceInfServiceSoapBinding" type="tns:HelloWorldServiceInf"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> - <wsdl:operation name="sayHello"> <soap:operation soapAction="" style="document" /> - <wsdl:input name="sayHello"> <soap:body use="literal" /> </wsdl:input> - <wsdl:output name="sayHelloResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> - <wsdl:service name="HelloWorldServiceInfService"> - <wsdl:port binding="tns:HelloWorldServiceInfServiceSoapBinding" name="HelloWorldServiceInfPort"> <soap:address location="http://localhost:9000/hello" /> </wsdl:port> </wsdl:service> </wsdl:definitions> 客户端调用 package com.cxf.client; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import com.cxf.interfaces.HelloWorldServiceInf; public class Client { public static void main(String[] args) { JaxWsProxyFactoryBean factoryBean=new JaxWsProxyFactoryBean(); factoryBean.getInInterceptors().add(new LoggingInInterceptor()); factoryBean.getOutInterceptors().add(new LoggingOutInterceptor()); factoryBean.setServiceClass(HelloWorldServiceInf.class); factoryBean.setAddress("http://localhost:9000/hello"); HelloWorldServiceInf impl=(HelloWorldServiceInf) factoryBean.create(); System.out.println(impl.sayHello("张三")); } } ②方法二 package com.cxf.impl; import javax.jws.WebService; import javax.xml.ws.Endpoint; import com.cxf.interfaces.HelloWorldServiceInf; @WebService(endpointInterface="com.cxf.interfaces.HelloWorldServiceInf","+username; } public static void main(String[] args) { Server impl=new Server(); String address="http://localhost:9000/hello"; Endpoint.publish(address,impl); } } wsdl文件 <?xml version="1.0" ?> <wsdl:definitions name="helloWorldService" targetNamespace="http://impl.cxf.com/" xmlns:ns1="http://interfaces.cxf.com/" xmlns:ns2="http://schemas.xmlsoap.org/wsdl/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://impl.cxf.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:import location="http://localhost:9000/hello?wsdl=HelloWorldServiceInf.wsdl" namespace="http://interfaces.cxf.com/" /> <wsdl:binding name="helloWorldServiceSoapBinding" type="ns1:HelloWorldServiceInf"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="sayHello"> <soap:operation soapAction="" style="document" /> <wsdl:input name="sayHello"> <soap:body use="literal" /> </wsdl:input> <wsdl:output name="sayHelloResponse"> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="helloWorldService"> <wsdl:port binding="tns:helloWorldServiceSoapBinding" name="ServerPort"> <soap:address location="http://localhost:9000/hello" /> </wsdl:port> </wsdl:service> </wsdl:definitions> 客户端调用 package com.cxf.client; import javax.xml.namespace.QName; import javax.xml.ws.Service; import javax.xml.ws.soap.SOAPBinding; import com.cxf.interfaces.HelloWorldServiceInf; public class Client { //注意:此处http://interfaces.cxf.com/ 来源于wsdl文件中namespace <wsdl:import location="http://localhost:9000/hello?wsdl=HelloWorldServiceInf.wsdl" namespace="http://interfaces.cxf.com/" /> private static final QName SERVICE_NAME=new QName("http://interfaces.cxf.com/","HelloWorldServiceInf");//HelloWorldServiceInf接口类的名称 private static final QName PORT_NAME=new QName("http://interfaces.cxf.com/","HelloWorldServiceInfPort");//HelloWorldServiceInfPort 接口类的名称+Port public static void main(String[] args) { String endPointAddress="http://localhost:9000/hello"; Service service=Service.create(SERVICE_NAME); service.addPort(PORT_NAME,SOAPBinding.SOAP11HTTP_BINDING,endPointAddress); HelloWorldServiceInf inf=service.getPort(HelloWorldServiceInf.class); System.out.println(inf.sayHello("张三")); } } CXF根据wsdl文件动态调用WebService package com.cxf.client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; public class ClientFromWsdl { public static void main(String[] args) throws Exception{ JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:9000/hello?wsdl"); //sayHello 为接口中定义的方法名称 张三为传递的参数 返回一个Object数组 Object[] objects=client.invoke("sayHello","张三"); //输出调用结果 System.out.println(objects[0].toString()); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |