CXF生成webservice动态客户端

来源:互联网 发布:js 倒计时60秒 编辑:程序博客网 时间:2024/06/06 12:24

1、我这边的webservice接口是一个比较简单例子就不完全贴出,此接口的代码了,只展示主要部分
1.1接口代码

package com.ffcs.oss.webservice;import java.util.Map;import javax.jws.WebService;@WebServicepublic interface TestService {    public String sayHi( String message);}

1.2接口实现类代码

package com.ffcs.oss.webservice;import java.util.HashMap;import java.util.Map;import test.DataFormatUtil;public class TestServiceImpl implements TestService{    @Override    public String sayHi( String message) {        Map<String,Object> map = new HashMap<String,Object>();        map = DataFormatUtil.json2Map(message);//json字符串解    析,用实体传参很麻烦不建议使用。        return "Hello! "+map.get("name")+","+map.get("age");    }}

1.3接口工具类代码

package test;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import net.sf.json.JSONArray;import net.sf.json.JSONObject;public class DataFormatUtil {    public static Map<String, Object> json2Map(String jsonStr)       {         Map<String, Object> map = new HashMap<String, Object>();         JSONObject json = JSONObject.fromObject(jsonStr);         for (Iterator localIterator1 = json.keySet().iterator(); localIterator1.hasNext(); ) { Object k = localIterator1.next();           Object v = json.get(k);           if (v instanceof JSONArray) {             List list = new ArrayList();             Iterator it = ((JSONArray)v).iterator();             while (it.hasNext()) {               JSONObject json2 = (JSONObject)it.next();               list.add(json2Map(json2.toString()));             }             map.put(k.toString(), list);           } else {             map.put(k.toString(), v);           } }         return map;       }}

以上是发布的接口代码。

2.用CXF生成动态客户端
2.1pow.xml文件,注意要导三个包

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>cn.tedu</groupId>    <artifactId>sss</artifactId>    <version>0.0.1-SNAPSHOT</version>    <packaging>war</packaging>    <dependencies>    <!--注意导三个包,不能知道cxf-rt-frontend-jaxws这个包,不然会报Could not find conduit initiator for address:异常 -->        <dependency>            <groupId>org.apache.cxf</groupId>            <artifactId>cxf-rt-frontend-jaxws</artifactId>            <version>3.1.12</version>        </dependency>        <dependency>            <groupId>org.apache.cxf</groupId>            <artifactId>cxf-rt-transports-http</artifactId>            <version>3.1.12</version>        </dependency>        <dependency>            <groupId>org.apache.cxf</groupId>            <artifactId>cxf-rt-transports-http-jetty</artifactId>            <version>3.1.12</version>        </dependency>        <dependency>            <groupId>net.sf.json-lib</groupId>            <artifactId>json-lib</artifactId>            <version>2.4</version>        </dependency>    </dependencies></project>

2.2生成动态客户端代码

package test;import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;/* * 动态客户端案例 *  */public class Test {    public static void main(String[] args) {        try         {         JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();         org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:8090/mywebs/services?wsdl");                 //sayHi 为接口中定义的方法名称   str为传递的参数   返回一个Object数组        String str = "{\"name\":\"Jaky\";\"age\":\"24\"}";//当传输的是多个参数时,可以用Json字符串或xml格式传输        Object[] objects=client.invoke("sayHi",str);            //输出调用结果         System.out.println(objects[0].toString());         }         catch(Exception e)         {         e.printStackTrace();         }         } }

我这边是采用json来传输多个参数,在网上有看到很多是用实体,感觉挺麻烦的,个人不是很建议。对于数据量比较大的可以使用xml的形式传输,在接口程序段增加一个解析xml的方法就可以了,客户端这边就只需要以xml字符串的格式作为入参,比较方便。

3.效果展示
3.1发布我写的接口
这里写图片描述

3.2运行动态客户端程序。
这里写图片描述