leoooooo_ 2016-10-26 02:32 采纳率: 0%
浏览 2219

CXF webservice传递复杂对象Map

  1. 用cxf写了一个webservice,测试的时候可以传入String,为了传入Map,写了转换类,在Myeclipse10上是可以传Map的,现在项目用的是2014,用maven搭建的,移植的时候发现不能传Map了,求大神指教,下面上图
    配置文件
    图片说明
    service

    @WebService
    @SOAPBinding(style=Style.RPC)
    public interface TestService {
    public String test(String s);
    public String sendMap(@XmlJavaTypeAdapter(StringObjectMapAdapter.class) Map<String, Object> data);
    }
    

    实现类
    @WebService
    @SOAPBinding(style=Style.RPC)
    public class TestServiceImpl implements TestService {

    @Override
    public String test(String s) {
    return s;
    }
    @Override
    public String sendMap(@XmlJavaTypeAdapter(StringObjectMapAdapter.class) Map data) {
    return data.toString();
    }
    }


转换类和转换类型类
public class Data {

private List<Entry> list = new ArrayList<Entry>();

public void addEntry(String fieldName, Object fieldValue) {
    Entry entry = new Entry();
    entry.setKey(fieldName);
    entry.setValue(fieldValue);
    list.add(entry);
}

public List<Entry> getList() {
    return list;
}

public void setList(List<Entry> list) {
    this.list = list;
}

public static class Entry {

    private String key;
    private Object value;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }
}

}

 public class StringObjectMapAdapter extends XmlAdapter<Data, Map<String, Object>> {

    @Override
    public  Map<String, Object> unmarshal(Data data) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        for (Data.Entry entry : data.getList()) {
            map.put(entry.getKey(), entry.getValue());
        }
        return map;
    }

    @Override
    public Data marshal(Map<String, Object> map) throws Exception {
        Data data = new Data();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            data.addEntry(entry.getKey(), entry.getValue());
        }
        return data;
    }
}

客户端测试类
public class ClientTest {
public static void main(String[] args) {
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
//webservice地址
String path = "http://127.0.0.1:8080/Demo/services/TestService?wsdl";
// 创建客户端连接
Client client = dcf.createClient(path);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy hcp = new HTTPClientPolicy();
hcp.setConnectionTimeout(2000);//连接超时
hcp.setReceiveTimeout(200000);//请求超时
http.setClient(hcp);
Object[] obj = null;
Map map = new HashMap();
map.put("a", "111");
try {
//将map序列化后调用接口方法
Data map1 = new StringObjectMapAdapter().marshal(map);
// obj = client.invoke("sendMap", map1);
obj = client.invoke("sendMap", map);
} catch (Exception e) {
}
String returnData = obj[0].toString();//返回的数据串
System.out.println(returnData);
}
}

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2016-10-27 16:52
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#c语言#的问题:这个六个方程输入程序可以得出角度角速度角加速度
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油