加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

webService怎么返回map类型

发布时间:2020-12-17 00:20:16 所属栏目:安全 来源:网络整理
导读:CXF形参、返回值 1. 当形参和返回值的类型是String、基本数据类型是,CXF肯定可以轻松处理 2.当形参和返回值的类型是javabean式的复合类(就是普通的POJO实体类)、List集合、数组等复杂类型时, CXF也可以很好处理。 3.还有一些像Map、非javabean式的复合类
CXF形参、返回值
1. 当形参和返回值的类型是String、基本数据类型是,CXF肯定可以轻松处理
2.当形参和返回值的类型是javabean式的复合类(就是普通的POJO实体类)、List集合、数组等复杂类型时, CXF也可以很好处理。
3.还有一些像Map、非javabean式的复合类,CXF是处理不了的
?? 如果遇到系统无法自动处理的类型,就需要程序员自行处理,方法是提供一个转化器,该转化器负责把CXF不能处理的类型,转化为CXF能够处理的类型,具体过程如下:
(1) 使用注解 @XmlJavaTypeAdapter(java自身的注解,可在jdkAPI文档中查到)修饰CXF无法自动处理的类型,使用该Annotation时,通过value属性指定一个转换器(自己定义)。
@XmlJavaTypeAdapter (value="MyXmlAdapter.class")?


(2) 实现自己定义的转化器,实现转化器时,需要开发一个CXF能够处理的类型。
1. 注解@XmlJavaTypeAdapter标识返回值为Map的接口

  1. @WebService??
  2. public interface HelloWorld {??
  3. ??????
  4. ????@XmlJavaTypeAdapter((XmlMapAdapter.class)) Map<String,String>?getSpace(String deviceIp);??
  5. ??????
  6. }??

实现类保持不变:
  1. @Component("hello")??
  2. @WebService(endpointInterface?=?"demo.spring.service.HelloWorld")??
  3. public class HelloWorldImpl implements HelloWorld {??
  4. ??
  5. ????public Map>?getSpace(String deviceIp) {??
  6. ????????// TODO Auto-generated method stub??
  7. ????????HashMap>?test?=?new?HashMap>();??
  8. ????????test.put("test",??"10.5");??
  9. ????????test.put("ip",deviceIp);??
  10. ??????????
  11. ????????System.out.println("deviceIp: " + deviceIp);??
  12. ??????????
  13. ????????return test;??
  14. ????}??
  15. }??

???? 2.定义自行创建的XmlMapAdapter类型
  • public class XmlMapAdapter extends XmlAdapterMyStringMap,Map>>?{??
  • ??
  • ????@Override??
  • ????public Map>?unmarshal(MyStringMap v) throws Exception {??
  • ????????// TODO Auto-generated method stub??
  • ??????????
  • ????????Map>?result?=?new?HashMap>();??
  • ??????????
  • ????????for (Entry entry : v.getEntries()) {??
  • ????????????result.put(entry.getKey(),entry.getValue());??
  • ????????}??
  • ??????????
  • ????????return result;??
  • ????}??
  • ??
  • ????@Override??
  • ????public MyStringMap marshal(Map>?v) throws Exception {??
  • ????????// TODO Auto-generated method stub??
  • ????????MyStringMap?msm?=?new?MyStringMap();??
  • ????????ListEntry>?eList?=?new?ArrayList>();??
  • ????????for(String key : v.keySet()) {??
  • ??????????????
  • ????????????Entry?entry?=?new?Entry();??
  • ????????????entry.setKey(key);??
  • ????????????entry.setValue(v.get(key));??
  • ????????????eList.add(entry);??
  • ????????}??
  • ????????msm.setEntries(eList);??
  • ????????return msm;??
  • ????}????
  • ??
  • }??

  • 通过继承XmlAdapter<ValueType,BoundType>类型,便可已将CXF不能处理的类型进行转换。
    jdkAPI中定义如下,valuType是能够处理的类型,boundType是不能处理的类型:
    转化的实质是将不能处理的类型,如Map,将其值取出,赋予另一个实体类,这个类模拟Map,保存他的值,这样便是可以进行相互转化。为此,需要定义一个Map的模拟类,这样Map的key和value都保存在Entry类中(Entry自行定义,名字也可以随便,只要符合命名规范就行),所有的Entry保存在List中,这样一个Map集合就转化成了MyStringMap类,MyStringMap自然也可以转化为Map类:
    1. public class MyStringMap {??
    2. ??????
    3. ????private List>?entries;??
    4. ??
    5. ????/**??
    6. ???? * @return entries??
    7. ???? */??
    8. ????public List>?getEntries() {??
    9. ????????return entries;??
    10. ????}??
    11. ??
    12. ????/**??
    13. ???? * @param entries the entries to set??
    14. ???? */??
    15. ????public void setEntries(List>?entries) {??
    16. ????????this.entries?=?entries;??
    17. ????}??
    18. ??????
    19. ????public static class Entry {??
    20. ????????private String key;??
    21. ????????private String value;??
    22. ????????/**??
    23. ???????? * @return key??
    24. ???????? */??
    25. ????????public String getKey() {??
    26. ????????????return key;??
    27. ????????}??
    28. ????????/**??
    29. ???????? * @param key the key to set??
    30. ???????? */??
    31. ????????public void setKey(String key) {??
    32. ????????????this.key?=?key;??
    33. ????????}??
    34. ????????/**??
    35. ???????? * @return value??
    36. ???????? */??
    37. ????????public String getValue() {??
    38. ????????????return value;??
    39. ????????}??
    40. ????????/**??
    41. ???????? * @param value the value to set??
    42. ???????? */??
    43. ????????public void setValue(String value) {??
    44. ????????????this.value?=?value;??
    45. ????????}??
    46. ??????????
    47. ??????????
    48. ????}?????????
    49. }??

    3.部署项目到tomcat中,启动,如能访问到WSDL文件,WSDL发布成功。
    4.使用命令生成客户端,具体方法见博文。
    5.测试客户端:
  • public static void main(String []args) {??
  • ?????? HelloWorldImplService?service?=?new?HelloWorldImplService();??
  • ????????
  • ?????? HelloWorld?hw?=?service.getHelloWorldImplPort();??
  • ????????
  • ?????? MyStringMap?msm?=?hw.getSpace("");??
  • ????????
  • ?????? List>?entries?=?msm.getEntries();??
  • ????????
  • ?????? for (Entry e : entries) {??
  • ?????????? System.out.println("key: " + e.getKey() + " " + "value: " + e.getValue());??
  • ?????? }??
  • ?? }??

  • 结果如下
    1. 2013-4-3 15:56:19 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL??
    2. 信息: Creating Service {http://service.spring.demo/}HelloWorldImplService from WSDL:?http://192.168.1.133:8088/CXFUseCase/services/helloWorld?wsdl??
    3. key: test value: 10.5??
    4. key: ip value: 192.168.3.51??

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读