CXF生成webservice动态客户端

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

package com.ffcs.oss.webservice;

import java.util.Map;
import javax.jws.WebService;

@WebService
public 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运行动态客户端程序。
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值