一、服务端:

  1、创建接口:

package cn.tdtk.ws.dao;

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

import javax.jws.WebService;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import cn.tdtk.ws.domain.Cat;
import cn.tdtk.ws.domain.Horse;
import cn.tdtk.ws.domain.User;
import cn.tdtk.ws.util.FkXmlAdapter;

/** @WebService 所修饰的接口,那么接口里面的方法全部都属于web的服务 */
@WebService
public interface HelloWorld {
  //基本数据类型都可以CXF进行实习
  String sayHello(String name);

  //复杂数据类型
  List<Cat> getCatsByUser(User user);

  /** CXF不能处理Map<String,Cat>类型,于是采用FkXmlAdapter进行处理。*/
  @XmlJavaTypeAdapter(FkXmlAdapter.class)Map<String,Cat> getAllCats();

  Horse selectMaxLongName(Horse h1,Horse h2);
}

  2、实现接口:

  

package cn.tdtk.ws.dao.impl;

import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;

import cn.tdtk.ws.dao.HelloWorld;
import cn.tdtk.ws.dao.UserService;
import cn.tdtk.ws.domain.Cat;
import cn.tdtk.ws.domain.Horse;
import cn.tdtk.ws.domain.User;

public class HelloWorldImpl implements HelloWorld {

  @Override
  public String sayHello(String name) {
    return name + ",你好,现在的时间是: "+new Date();
  }

  @Override
  public List<Cat> getCatsByUser(User user) {
    // 在这里只是调用业务逻辑组件,而不实现,具体的实现由业务类去完成

    UserService us = new UserServiceImpl();
    return us.getCatsByUser(user);
  }

  @Override
  public Map<String, Cat> getAllCats() {
    UserService us = new UserServiceImpl();
    return us.getAllCats();
  }

  @Override
  public Horse selectMaxLongName(Horse h1, Horse h2) {
    if(h1.getName().length()>h2.getName().length())
      return h1;
    else{
        h2.setImage(new DataHandler(new FileDataSource(
          new File("c:\\"+File.separator+"1.jpg"))));
        return h2;
    }
  }

}

  3、将Map类型与简单类型互相转换:

package cn.tdtk.ws.util;

import java.util.List;

import cn.tdtk.ws.domain.Cat;

public class StringCat {

public static class Entry {
private String key;
private Cat value;
public Entry() {
super();
}

public Entry(String key, Cat value) {
super();
this.key = key;
this.value = value;
}

public String getKey() {
return key;
}

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

public Cat getValue() {
return value;
}

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

}

private List<Entry> entrys;

public List<Entry> getEntrys() {
return entrys;
}

public void setEntrys(List<Entry> entrys) {
this.entrys = entrys;
}

}

  4、XmlAdapter转换器:

package cn.tdtk.ws.util;

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

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

import cn.tdtk.ws.domain.Cat;
import cn.tdtk.ws.util.StringCat.Entry;

/**
* 该转换器负责 StringCat 和 Map<String, Cat> 类型的转换
* @author Administrator
*
*/
public class FkXmlAdapter extends XmlAdapter<StringCat, Map<String, Cat>> {

  @Override
  public Map<String, Cat> unmarshal(StringCat v) throws Exception {

    Map<String, Cat> result = new HashMap<String, Cat>();
    List<Entry> entrys = v.getEntrys();
    for(Entry en : entrys)
      result.put(en.getKey(), en.getValue());
    return result;
}

@Override
public StringCat marshal(Map<String, Cat> v) throws Exception {

  StringCat sc = new StringCat();
  List<Entry> entrys = new ArrayList<Entry>();
  for(String key : v.keySet())
    entrys.add(new Entry(key,v.get(key)));
  sc.setEntrys(entrys);
  return sc;
  }

}

  5、业务数据:

package cn.tdtk.ws.dao.impl;

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

import cn.tdtk.ws.dao.UserService;
import cn.tdtk.ws.domain.Cat;
import cn.tdtk.ws.domain.User;

public class UserServiceImpl implements UserService {

static Map<User,List<Cat>> catDb = new HashMap<User,List<Cat>>();
static{
List<Cat> catlist1= new ArrayList<Cat>();
catlist1.add(new Cat(1,"机器猫","橙色"));
catlist1.add(new Cat(2,"huanhuan","黑色"));
catlist1.add(new Cat(3,"xixi","红色"));
catDb.put(new User(1,"tom","123","shanghai"), catlist1);

List<Cat> catlist2= new ArrayList<Cat>();
catlist2.add(new Cat(1,"lulu","橙色"));
catlist2.add(new Cat(2,"haha","黑色"));
catDb.put(new User(1,"lili","123","shanghai"), catlist2);
}

@Override
public List<Cat> getCatsByUser(User user) {
return catDb.get(user);
}

@Override
public Map<String, Cat> getAllCats() {
Map<String, Cat> maps = new HashMap<String, Cat>();
int i=0;
for(List<Cat> lists : catDb.values()){
for(Cat cat : lists){
i++;
maps.put("第"+i+"个", cat);
}
}
return maps;
}

}

WS之cxf处理的复杂类型(Map)的更多相关文章

  1. WS之cxf与spring整合1

    1.在web.xml中加入CXFServlet: <!-- 下面表示所有来自/cxfservice/*的请求,都交给 CXFServlet来处理 .--> <servlet>  ...

  2. cxf client端借口类型找不到问题

    问题: log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.Exception in ...

  3. WS之cxf的权限拦截器应用

    一.服务器端: 1.权限判断: package cn.tdtk.ws.interceptor; import java.util.List; import org.apache.cxf.binding ...

  4. WS之cxf简单实现

    1.服务端实现: 1.1 定义接口,用@WebService修饰: /** @WebService 所修饰的接口,那么接口里面的方法全部都属于web的服务  */ @WebService public ...

  5. 匿名函数lambda,过滤函数filter,映射类型map

    匿名函数lambda, 作用是不用定义函数,用完之后会自动被删掉,在使用执行脚本的时候,使用lambda就可以省下定义函数的过程,简化代码的可读性. 格式是 例子g=lambda x,y:x+y g( ...

  6. WS之cxf与spring整合2

    在action中加入webservice

  7. 为什么final类型map和list内容可以修改

    URL地址:https://blog.csdn.net/AlbertFly/article/details/76855367

  8. (六)cxf处理一些Map等复杂类型

    前面讲的一些都是简单类型,cxf都支持.但是有些复杂类型,cxf是不支持,比如常用的Map类型: 下面我们在前面的实例基础上在加一个方法,比如我们现在有个需求,获取所有用用户以及对应的每个用户所有角色 ...

  9. CXF2.7整合spring发布webservice,返回值类型是Map和List<Map>类型

    在昨天研究了发布CXF发布webservice之后想着将以前的项目发布webservice接口,可是怎么也发布不起来,服务启动失败,原来是自己的接口有返回值类型是Map. 研究了一番之后,发现: we ...

随机推荐

  1. html5 canvas移动设备渲染测试

    最近项目闲着没什么事,又想起了canvas, 针对移动端设备默认浏览器,做了点渲染方面效率的测试,手头设备不多(有一些低端机型和pc chrome做对比),现将测试数据分享给大家吧,本想和css3 a ...

  2. 如何使用adb命令查看android中的数据库

    1,进入到控制台中,输入adb shell,进入到命令模式的环境中 2,输入:cd /data/data/ 3, 选择你所在的数据库文件,比如我的com.android.homework, 输入命令: ...

  3. QQ发送邮件

    //下面开始写SendEmail函数 public void SendEmail(string Emailshoujian, string Emailbiaoti, string Emailzheng ...

  4. CakeDC(cakephp company)Git workflow--适合于较大团队大型项目开发

    CakeDC Git workflow是一个项目开发和版本发布的工作流,在这个工作流程中开发和版本发布周期是基于几个关键阶段(key phases): Development: 所有活跃的开发活动都由 ...

  5. 瞎折腾之 NHibernate ORM框架的接触(MVC + Repository源码)(一)

    在这炮火连天.技术更新迅猛的年代,不接触了解.甚至会用2~3种框架都不好意思说自己有多少年工作经验.况且出去面试也会有点吹牛的底子嘛. 这次折腾了NHibernate.其实这些ORM框架封装好了都是给 ...

  6. 最小生成树之Kruskal

    模板题,学习一下最小生成树的Kruskal算法 对于一个连通网(连通带权图,假定每条边上的权均为大于零的实数)来说,每棵树的权(即树中所有边的权值总和)也可能不同 具有权最小的生成树称为最小生成树 生 ...

  7. iOS基础CGAffineTransform的简单使用

    CoreGraphics框架中的CGAffineTransform类可用于设定UIView的transform属性,控制视图的缩放.旋转和平移操作: 另称放射变换矩阵,可参照线性代数的矩阵实现方式0. ...

  8. 二分图带权匹配、最佳匹配与KM算法

    ---------------------以上转自ByVoid神牛博客,并有所省略. [二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和 ...

  9. Wireshark基本介绍和学习TCP三次握手(转)

    http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html 之前写过一篇博客:用 Fiddler 来调试HTTP,HTTPS. 这篇 ...

  10. 【自动化测试】Selenium处理富文本框

    http://blog.csdn.net/fudax/article/details/8089404 selenium处理富文本框,日历控件等 调用JS修改value值 document.getEle ...