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 map = new HashMap();
        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.0modelVersion>
    <groupId>cn.tedugroupId>
    <artifactId>sssartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <packaging>warpackaging>

    <dependencies>
    
        <dependency>
            <groupId>org.apache.cxfgroupId>
            <artifactId>cxf-rt-frontend-jaxwsartifactId>
            <version>3.1.12version>
        dependency>
        <dependency>
            <groupId>org.apache.cxfgroupId>
            <artifactId>cxf-rt-transports-httpartifactId>
            <version>3.1.12version>
        dependency>
        <dependency>
            <groupId>org.apache.cxfgroupId>
            <artifactId>cxf-rt-transports-http-jettyartifactId>
            <version>3.1.12version>
        dependency>
        <dependency>
            <groupId>net.sf.json-libgroupId>
            <artifactId>json-libartifactId>
            <version>2.4version>
        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发布我写的接口
CXF生成webservice动态客户端_第1张图片

3.2运行动态客户端程序。
CXF生成webservice动态客户端_第2张图片

你可能感兴趣的:(webservice)