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

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

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

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

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

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

1 @WebService
2 public interface HelloService {
3     public String sayHello(String name);
4     public String sayGoodBy(String name);
5     public String sayHello2(String name);
6
7     public @XmlJavaTypeAdapter((XmlMapAdapter.class)) Map<String, String> getSpace(String name);
8 }

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

 1 public class MyStringMap {
 2         private List<Entry> entries;
 3
 4     /**
 5      * @return entries
 6      */
 7     public List<Entry> getEntries() {
 8         return entries;
 9     }
10
11     /**
12      * @param entries the entries to set
13      */
14     public void setEntries(List<Entry> entries) {
15         this.entries = entries;
16     }
17
18     public static class Entry {
19         private String key;
20         private String value;
21         /**
22          * @return key
23          */
24         public String getKey() {
25             return key;
26         }
27         /**
28          * @param key the key to set
29          */
30         public void setKey(String key) {
31             this.key = key;
32         }
33         /**
34          * @return value
35          */
36         public String getValue() {
37             return value;
38         }
39         /**
40          * @param value the value to set
41          */
42         public void setValue(String value) {
43             this.value = value;
44         }
45
46     }
47 }

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

 1 public class XmlMapAdapter extends XmlAdapter<MyStringMap, Map<String, String>>{
 2         @Override
 3         //Map(不可处理)转换为可处理的类(自定义的POJO类,就是模拟Map的一个类)
 4         public MyStringMap marshal(Map<String, String> v) throws Exception {
 5                 MyStringMap result = new MyStringMap();
 6                 List<pojo.MyStringMap.Entry> entries = new ArrayList<MyStringMap.Entry>();
 7                 for(Entry<String, String> e : v.entrySet()){
 8                         pojo.MyStringMap.Entry entry = new pojo.MyStringMap.Entry();
 9                         entry.setKey(e.getKey());
10                         entry.setValue(e.getValue());
11                         entries.add(entry);
12                 }
13                 result.setEntries(entries);
14                 return result;
15
16         }
17         //自定义可处理类转换为Map(不可处理的类型)
18         @Override
19         public Map<String, String> unmarshal(MyStringMap v) throws Exception {
20                 Map<String, String> result = new HashMap<String, String>();
21                 for(pojo.MyStringMap.Entry e : v.getEntries()){
22                         result.put(e.getKey(), e.getValue());
23                 }
24                 return result;
25         }
26 }

(4)接口的实现类

 1 @WebService(endpointInterface="com.webservice.HelloService",serviceName="MyService",targetNamespace="http://www.baidu.com")
 2 public class HelloServiceImpl implements HelloService {
 3
 4         @WebMethod(operationName="AliassayHello")
 5         @WebResult(name="myReturn")
 6         @Override
 7         public String sayHello(@WebParam(name="name")String name) {
 8                 System.out.println("Hello,"+name);
 9                 return "Hello,"+name;
10         }
11
12         @Override
13         public String sayGoodBy(@WebParam(name="name")String name) {
14                 System.out.println("GoodBy,"+name);
15                 return "GoodBy,"+name;
16         }
17
18         @WebMethod(exclude=true)//不会被发布出去
19         @Override
20         public String sayHello2(String name) {
21                 System.out.println("hello2"+ name);
22                 return "Hello2,"+name;
23         }
24
25         @Override
26         public Map<String, String> getSpace(String name) {
27                 HashMap<String, String> resultMap = new HashMap<String,String>();
28
29                 resultMap.put("age", "12");
30                 resultMap.put("name", name);
31                 resultMap.put("orid", "123123");
32                 resultMap.put("address", "北京");
33
34         System.out.println(resultMap);
35         return resultMap;
36         }
37
38         public static void main(String[] args) {
39                 Endpoint.publish("http://127.0.0.1:8099/hello", new HelloServiceImpl());
40                 System.out.println("服务发布成功!");
41         }
42
43 }

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

soap请求消息:

soap响应

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

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

转载于:https://www.cnblogs.com/xiaojianfeng/p/6078195.html

webservice返回值为Map类型的处理方法相关推荐

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

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

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

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

  3. C++中函数模板的返回值是模板类型参数的调用方法

    1 函数模板 模板定义以关键字template开始,后接模板形参表,模板形参表是用尖括号扩住的一个或多个模板形参的列表,形参之间以逗号分隔.关于函数模板的详细介绍,请参考<C++中模板函数及模板 ...

  4. SpringMVC的返回值和参数类型

    传统的基于Spring Framework的web开发需要大量的 xml 配置,在有SpringBoot以后,Web开发的效 率得到了很大的提升,几乎大部分配置可以使用默认约定的规则.我们基于Spri ...

  5. SpringMVC——处理方法返回值的可选类型

    spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void.下面将对具体的一一进行说明: 一.Model ...

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

    原文地址:http://www.cnblogs.com/xiepeixing/p/4243801.html  感谢原作者! spring mvc 支持如下的返回方式:ModelAndView, Mod ...

  7. Python 函数参数有冒号 声明后有- 箭头 返回值注释 参数类型注释

    在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...

  8. python函数返回多个值时的数据类型是_Python3 注释多个返回值的函数类型

    场景 这要是讲函数注释的用法 没有返回值 def function(ver: str): print(var) 单个返回值 def function(ver: str) -> dict: a=[ ...

  9. python冒号声明类型_Python 函数参数有冒号 声明后有- 箭头 返回值注释 参数类型注释...

    在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...

最新文章

  1. 集中配置管理工具puppet安装使用
  2. 英语发音表及读法_在英语中年月日的读法和写法(附:英美时间表达差异辨析)...
  3. 分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!
  4. JS面向对象的程序设计之继承-继承的实现-借用构造函数
  5. java并发包系列---LockSupport
  6. AutoFac+MVC+WebApi源码----我踩过的坑
  7. ABAP操作Excel(转)
  8. Map 3D API二次开发学习指南
  9. 金税盘组件接口调用方法
  10. 一个函数能否被两个线程同时调用
  11. Java高级工程师必备知识!kafka消费topic命令
  12. [Git命令]上传单个文件到GitHub项目已有文件夹
  13. 用python实现相声、评书自动下载(一)
  14. 眼见不一定为实!18个神奇的视错觉,看完不相信眼睛系列
  15. KEPServerEX助力能源巨擎实现工业4.0
  16. 微信群视频代理服务器,在微信群里发大于20M的视频,方法竟然这么简单
  17. 如何阻止浏览器的默认行为?
  18. 下载YouTube视频的一种方法
  19. oracle linux i386,在CentOS 5.5 i386 上安装 Oracle 10G XE
  20. 延伸产业链推进水稻循环经济 国稻种芯集团谋定益海嘉里合作

热门文章

  1. 惯性测量单元预积分原理与实现
  2. 一文读懂 12种卷积方法(含1x1卷积、转置卷积和深度可分离卷积等)
  3. 岳飞诗词集萃[zz]
  4. 怎样降低计算机屏幕亮度,如何调低电脑屏幕亮度【解决步骤】
  5. python+ opencv实现摄像头实时人脸识别并实现汉字标框
  6. js基础--数据类型
  7. 创建自己的RSS服务——debian docker TinyTinyRSS搭建
  8. mysql仿网易评论_Android仿抖音评论列表(加评论功能)/网易云音乐列表
  9. Like What You Like: Knowledge Distill via Neuron Selectivity Transfer 论文翻译
  10. 计算机网络面试常见知识点(含HTTPS和TLS)