您的位置:首页 > 编程语言 > Java开发

java调用基于SOAP的CXF 框架的WebService客户端和服务器段helloworld例子

2014-02-20 17:34 579 查看
依赖的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.WebParam;

import javax.jws.WebService;

@WebService

public interface HelloWorldServiceInf {

String sayHello(@WebParam(name="username") String username);

}
发布和调用webservice

方法一

发布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("张三"));

}

}

方法二

发布webservice

package com.cxf.impl;

import javax.jws.WebService;

import javax.xml.ws.Endpoint;

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();

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());

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: