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运行动态客户端程序。