您的位置:首页 > 编程语言

使用CXF开发WebService程序的总结(五):基于Map数据类型处理的的客户端和服务端代码的编写

2018-01-02 13:49 951 查看

1. 首先我们按照List或数组等处理方式来处理Map,看看效果

1.1 在服务端的接口中添加以下方法
/**
* 查询所有班级信息加上对应的学生列表
*
* @return
*/
public Map<String, List<User>> findAllUsers();
1.2 在实现类中模拟数据库访问实现
@Override
public Map<String, List<User>> findAllUsers() {
Map<String, List<User>> map = new HashMap<>();
List<User> users1 = new ArrayList<>();
users1.add(new User(1, "aa", 1));
users1.add(new User(2, "bb", 1));
map.put("1班", users1);

List<User> users2 = new ArrayList<>();
users2.add(new User(3, "cc", 2));
map.put("2班", users2);

return map;
}
1.3 发布 看结果



1.4 结论:CXF只支持String,基本数据类型,JavaBean类型,List集合,数组的转化,不支持Map及非JavaBean的类型的转换。

2. 解决CXF不能处理Map的方法

解决思路就是  将 Map通过适配器 转成 cxf可以处理的数据类型

2.1 在服务端的接口中指定方法上添加注解  @XmlJavaTypeAdapter(value = MapAdapter.class),例如如下:
/**
* 查询所有班级信息加上对应的学生列表
*
* @return
*/
@XmlJavaTypeAdapter(value = MapAdapter.class)
public Map<String, List<User>> findAllUsers();
这里的 类MapAdapter 是 用来进行编排和编排的

2.2 创建和实现转换类
package com.lonely.adapter;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.bind.annotation.adapters.XmlAdapter;

import com.lonely.pojo.MyClass;
import com.lonely.poj
4000
o.User;

public class MapAdapter extends XmlAdapter<MyClass[], Map<String, List<User>>> {

@Override
public Map<String, List<User>> unmarshal(MyClass[] v) throws Exception {
Map<String, List<User>> map = new HashMap<>();
for (MyClass myClass : v) {
map.put(myClass.getKey(), myClass.getValue());
}
return map;
}

@Override
public MyClass[] marshal(Map<String, List<User>> v) throws Exception {
MyClass[] myClasses = new MyClass[v.size()];
int i = 0;
for (String key : v.keySet()) {
myClasses[i] = new MyClass();
myClasses[i].setKey(key);
myClasses[i].setValue(v.get(key));
i++;
}
return myClasses;
}

}
在这里用到了 MyClass[] ,MyClass是对我们的Map数据做得一个封装,里面实际上跟map一样。有key和value

2.3 自定义bean MyClass
package com.lonely.pojo;

import java.util.List;

/**
* map转换的 自定义bean
*
* @author 15072
*
*/
public class MyClass {

private String key;
private List<User> value;

public String getKey() {
return key;
}

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

public List<User> getValue() {
return value;
}

public void setValue(List<User> value) {
this.value = value;
}

public MyClass() {
super();
// TODO Auto-generated constructor stub
}

public MyClass(String key, List<User> value) {
super();
this.key = key;
this.value = value;
}

}
2.4 至此,在来发布,发现发布成功,下面就是客户端调用测试

3. 客户端调用测试

3.1 编写测试
package com.lonely.client;

import java.util.List;

import com.lonely.server.HelloWs;
import com.lonely.server.HelloWsService;
import com.lonely.server.MyClass;
import com.lonely.server.MyClassArray;
import com.lonely.server.User;

public class HelloInvoking {

public static void main(String[] args) {
HelloWsService helloWsService = new HelloWsService();
HelloWs helloWs = helloWsService.getHelloWsPort();
// System.out.println(helloWs.sayHelloWs("dugu"));

/*
* Clazz clazz = new Clazz(); clazz.setClassId(1); List<User> list =
* helloWs.findUsersByClassId(clazz); for (User user : list) {
* System.out.println(user.getUsername() + ":" + user.getClassId()); }
*/

MyClassArray myClassArray = helloWs.findAllUsers();
List<MyClass> list = myClassArray.getItem();
for (MyClass myClass : list) {
System.out.println("班级:" + myClass.getKey());
List<User> users = myClass.getValue();
for (User user : users) {
System.out.println("\t学生:" + user.getUsername());
}
}
}
}
3.2 查看结果 发现成功调用

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