CXF处理一些Map等复杂类型
来源:互联网 发布:我知女人心南宫寒txt 编辑:程序博客网 时间:2024/06/05 05:59
前面一些都是简单类型,cxf都支持。但是有些复杂类型,cxf是不支持,比如常用的Map类型
下面我们在前面的实例基础上在加一个方法,比如我们现在有个需求,获取所有用用户以及对应的每个用户所有角色信息
在HelloWorld接口上写一个Map接口
public Map<String,List<Role>> getRoles();
在HelloWorldImpl实现类上编写实现
public Map<String, List<Role>> getRoles() {Map<String,List<Role>> map=new HashMap<String,List<Role>>();List<Role> roleList1=new ArrayList<Role>();roleList1.add(new Role(1,"技术总监"));roleList1.add(new Role(2,"架构师"));map.put("gcx", roleList1);List<Role> roleList2=new ArrayList<Role>();roleList2.add(new Role(3,"程序员"));map.put("jack", roleList2);return map;}运行服务报错:
解决办法
在HelloWorld接口的方法上加上注解
@XmlJavaTypeAdapter(MapAdapter.class)public Map<String,List<Role>> getRoles();
然后创建一个类叫MapAdapter 继承 XmlAdapter
package com.gcx.Adapter;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.xml.bind.annotation.adapters.XmlAdapter;import com.gcx.entity.Role;public class MapAdapter extends XmlAdapter<MyRole[], Map<String,List<Role>>> {@Overridepublic Map<String, List<Role>> unmarshal(MyRole[] v) throws Exception {Map<String,List<Role>> map=new HashMap<String,List<Role>>();for(int i=0;i<v.length;i++){MyRole role=v[i];map.put(role.getKey(), role.getValue());}return map;}@Overridepublic MyRole[] marshal(Map<String, List<Role>> v) throws Exception {MyRole[] roles=new MyRole[v.size()];int i=0;for(String key:v.keySet()){roles[i]=new MyRole();roles[i].setKey(key);roles[i].setValue(v.get(key));i++;}return roles;}}
这里的话XmlAdapter要加两个参数,XmlAdapter<ValueType,BoundType>
ValueType是cxf能接收的类型,这里我用了数组
BoundType是cxf不能接受的类型,也就是我例子里的需求的Map类型
还有一个MyRole自定义类型,key:value。我们搞成两个属性,具体实现如下
package com.gcx.Adapter;import java.util.List;import com.gcx.entity.Role;/** * cxf能够接受自定义实体 * @author gcx * */public class MyRole {private String key;private List<Role> value;public MyRole() {// TODO Auto-generated constructor stub}public MyRole(String key, List<Role> value) {super();this.key = key;this.value = value;}public String getKey() {return key;}public void setKey(String key) {this.key = key;}public List<Role> getValue() {return value;}public void setValue(List<Role> value) {this.value = value;}@Overridepublic String toString() {return "MyRole [key=" + key + ", value=" + value + "]";}}
OK 这样就行了。我们运行Server类,发布webservice接口
然后就到了webservice客户端,我们用wsdl2java工具生成下最新代码,具体过程前面讲过,这里不重复
我们修改下Client类
package com.gcx.service;import java.util.List;public class Client {public static void main(String[] args) {HelloWorldService service=new HelloWorldService();HelloWorld helloWorld=service.getHelloWorldPort();MyRoleArray roles = helloWorld.getRoles();List<MyRole> item = roles.item;for(int i=0;i<item.size();i++){MyRole myRole = item.get(i);System.out.print(myRole.key+":");for(Role my:myRole.value){System.out.print(my.getId()+","+my.getRoleName());}System.out.println("==");}}}
运行结果如下:
OK,这样就实现了复杂类型的调用!!!
阅读全文
0 0
- CXF 处理一些Map 等复杂类型
- cxf处理一些Map等复杂类型
- CXF处理一些Map等复杂类型
- 6.Web Service CXF处理一些Map等复杂类型
- 【WebService】CXF处理javaBean等复合类型以及Map等复杂类型的数据
- 【WebService】CXF处理javaBean等复合类型以及Map等复杂类型的数据
- CXF--处理复杂类型
- WS之cxf处理的复杂类型(Map)
- 【WebService框架-CXF】——CXF对Map等无法自动转化的类型的处理
- webservice学习之处理Map等CXF无法自动转化的类型
- webservice学习之处理Map等CXF无法自动转化的类型
- webservice学习之处理Map等CXF无法自动转化的类型
- webservice学习之处理Map等CXF无法自动转化的类型
- Jackson 处理复杂类型(List,map)
- 处理Map、非javabean式的复合类等CXF无法自动转化的类型 (3)
- Cxf 复杂数据类型(Map)
- Cxf 复杂数据类型(Map)
- CXF+JAXB处理复杂数据
- Spring单例Bean与单例模式的区别
- JVM内存模型
- python中怎么将一个模块发布和安装
- 域模型一定要实现Serializable接口吗?
- 技巧
- CXF处理一些Map等复杂类型
- http协议详解
- UnityShader入门精要学习笔记(十二):渲染路径与光源类型
- 匿名四轴上位机波形绘制软件所需的下位机报文协议编写
- OSI模型、TCP/IP模型
- datagrid.js
- Canvas入门
- 关于删除mysql用户的问题
- UnityShader入门精要学习笔记(十三):光照衰减与Unity阴影