在写一个webservice的时候,方法的返回值是一个复杂类型,处理方法是写一个结果类(Javabean)作为返回值。想着webservice方法返回值为Map的没写过,然后就试着写了一个简单的Demo。出错了...那我就来劲了,总有办法解决吧....

通过百度(你有Google癖好就用Google吧)。。找到方法,通过前辈们的经验找到解决方法。

业内人士都懂!注重版权,奉上原文链接:

http://blog.csdn.net/jspamd/article/details/8914427

贴上自个Demo代码之前,补充个知识点,webservice中发布方法的参数以及返回值可以很好的处理基本类型,POJO类,数组,以及list集合等复杂类型,但是在处理Map,非JavaBean式的类,我们需要自定义一个转换器,负责将webservice中不能处理的类型转换为可以处理的类型

(1)需要使用注解@XmlJavaTypeAdapter修饰返回类型

 @WebService
public interface HelloService {
public String sayHello(String name);
public String sayGoodBy(String name);
public String sayHello2(String name); public @XmlJavaTypeAdapter((XmlMapAdapter.class)) Map<String, String> getSpace(String name);
}

(2)自定义一个可以替代不可处理参数类型的类(可以理解为模拟Map接口的类,这个类是POJO)

 public class MyStringMap {
private List<Entry> entries; /**
* @return entries
*/
public List<Entry> getEntries() {
return entries;
} /**
* @param entries the entries to set
*/
public void setEntries(List<Entry> entries) {
this.entries = entries;
} public static class Entry {
private String key;
private String value;
/**
* @return key
*/
public String getKey() {
return key;
}
/**
* @param key the key to set
*/
public void setKey(String key) {
this.key = key;
}
/**
* @return value
*/
public String getValue() {
return value;
}
/**
* @param value the value to set
*/
public void setValue(String value) {
this.value = value;
} }
}

(3)自定义一个转换器(作为@XmlJavaTypeAdapter注解中value)

 public class XmlMapAdapter extends XmlAdapter<MyStringMap, Map<String, String>>{
@Override
//Map(不可处理)转换为可处理的类(自定义的POJO类,就是模拟Map的一个类)
public MyStringMap marshal(Map<String, String> v) throws Exception {
MyStringMap result = new MyStringMap();
List<pojo.MyStringMap.Entry> entries = new ArrayList<MyStringMap.Entry>();
for(Entry<String, String> e : v.entrySet()){
pojo.MyStringMap.Entry entry = new pojo.MyStringMap.Entry();
entry.setKey(e.getKey());
entry.setValue(e.getValue());
entries.add(entry);
}
result.setEntries(entries);
return result; }
//自定义可处理类转换为Map(不可处理的类型)
@Override
public Map<String, String> unmarshal(MyStringMap v) throws Exception {
Map<String, String> result = new HashMap<String, String>();
for(pojo.MyStringMap.Entry e : v.getEntries()){
result.put(e.getKey(), e.getValue());
}
return result;
}
}

(4)接口的实现类

 @WebService(endpointInterface="com.webservice.HelloService",serviceName="MyService",targetNamespace="http://www.baidu.com")
public class HelloServiceImpl implements HelloService { @WebMethod(operationName="AliassayHello")
@WebResult(name="myReturn")
@Override
public String sayHello(@WebParam(name="name")String name) {
System.out.println("Hello,"+name);
return "Hello,"+name;
} @Override
public String sayGoodBy(@WebParam(name="name")String name) {
System.out.println("GoodBy,"+name);
return "GoodBy,"+name;
} @WebMethod(exclude=true)//不会被发布出去
@Override
public String sayHello2(String name) {
System.out.println("hello2"+ name);
return "Hello2,"+name;
} @Override
public Map<String, String> getSpace(String name) {
HashMap<String, String> resultMap = new HashMap<String,String>(); resultMap.put("age", "12");
resultMap.put("name", name);
resultMap.put("orid", "123123");
resultMap.put("address", "北京"); System.out.println(resultMap);
return resultMap;
} public static void main(String[] args) {
Endpoint.publish("http://127.0.0.1:8099/hello", new HelloServiceImpl());
System.out.println("服务发布成功!");
} }

剩下的就是测试工作,这里就没写客户端程序去测试了,使用SoapUI测试下

soap请求消息:

soap响应

个人理解webservice中的转换器的思想机制和struts2 中的类型转换机制是一个样的。

朋友,看我这么帅,点个赞呗

webservice返回值为Map类型的处理方法的更多相关文章

  1. 使用MyBatis时接收值和返回值选择Map类型或者实体类型

    MyBatis作为现近JavaEE企业级项目开发中常用的持久层框架之一,以其简洁高效的ORM映射和高度的SQL的自由性被广大开发人员认可.Mybatis在接收系统传来的参数和返回的参数时主要可以有Ma ...

  2. SpringMVC Controller 返回值几种类型

    SpringMVC Controller 返回值几种类型 2016年06月21日 19:31:14 为who而生 阅读数:4189 标签: Controller 返回值类型spring mvc 更多 ...

  3. mybatis Mapper 中resultType使用方法及返回值为Map的写法

    mybatis学习(七)——resultType解析 resultType是sql映射文件中定义返回值类型,返回值有基本类型,对象类型,List类型,Map类型等.现总结一下再解释 总结: resul ...

  4. Spring MVC--------处理方法返回值的可选类型

    对于Spring MVC处理方法支持支持一系列的返回方式:  (1)ModelAndView (2)Model (3)ModelMap (4)Map (5)View (6)String (7)Void ...

  5. Swift2.0语言教程之函数的返回值与函数类型

    Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...

  6. C语言函数返回值和变量类型

    前言 最近在刷题,在写矩阵的快速幂的题时,对于返回值是数组的程序,写的十分冗杂.借此机会,重新梳理下C语言中函数的返回值与变量类型的关系. 按照变量的寿命,可以分为三种类型 1.静态变量 寿命从程序开 ...

  7. Mybaits查询返回值是List类型的

    查询返回值是list类型的 1 首先在接口中写方法 public interface EmployeeMapper { public List<Employee> getEmpsByLas ...

  8. Mybatis select返回值为map时,选取表字段的两列作为key,value

    项目需要从ibatis升级到MyBatis,dao中有一个方法返回Map类型,具体是查询语句查询两个字段,将结果列表字段A的值作为key字段B的值作为value存入Map中作为结果返回: ibatis ...

  9. SpringMVC Controller 返回值的可选类型

    spring mvc 支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void. ModelAndView @RequestMap ...

随机推荐

  1. Linux内核笔记——进程管理之执行体

    内核版本:linux-2.6.11 在Linux中,有多种执行体(指令流.执行单位),它们是CPU调度和分配资源的基本单位,它们是内核态可见的,即内核态下,每一种执行体都有对应的唯一数据结构task_ ...

  2. spring源码解析——spring源码导入eclipse

    一.前言     众所周知,spring的强大之处.几乎所有的企业级开发中,都使用了spring了.在日常的开发中,我们是否只知道spring的配置,以及简单的使用场景.对其实现的代码没有进行深入的了 ...

  3. 全本软件白名单 Quanben Software Whitelist

    Windows应用软件 Windows Applications (TBU) 全本推荐微软Windows 10操作系统 Quanben recommends Microsoft Windows 10 ...

  4. Thisgood

    this is good test print 'haha'

  5. Android 学习笔记之三—— 音效的使用

    在开发手电筒应用的处理音效的过程中,看网上使用的是MediaPlayer,因为音效一般都比较短,所以这里使用的是SoundPool,如下: SoundPool soundPool=new SoundP ...

  6. android 开发 gradle 自己会容易混淆的东西

    使用intellij idea 开发android ,关于 gradle 和 android gradle plugin 容易混淆地方,做下记录: 一. build.gradle 文件有两个地方存在, ...

  7. LINUX常见问题

    FQA1:如何进入linux单用户模式修改root密码 进入单用户模式:1. grub进入启动画面之后,敲入“e”,把光标移动到kernel ...那一行,再敲入“e”,在kernel 一行的最后加上 ...

  8. 解决nginx中proxy_pass到tomcat的session丢失问题

    之前在配置tomcat的时候都是一个项目对应一个tomcat,也就是一个端口.最近需要把两个项目整合到同一个tomcat中,通过配置nginx让两个域名指向同一tomcat的不同项目.整合完毕后发现其 ...

  9. C#程序员开发WinForm必须知道的 Window 消息大全

    不要以为下面的东西只有C++中才会用到哦! 消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用 ...

  10. Mac 终端 Linux 命令总结(简单命令)

    目录操作 命令名 功能描述 使用举例 mkdir 创建一个目录 mkdir dirname rmdir 删除一个目录 rmdir dirname mvdir 移动或重命名一个目录 mvdir dir1 ...