您的位置:首页 > 其它

CXF生成webservice动态客户端

2017-09-29 18:08 246 查看
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运行动态客户端程序。

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