文档章节

Map等CXF无法自动转换的复合数据类型的形参和返回值的处理

蜡笔小小小新
 蜡笔小小小新
发布于 2015/12/28 22:18
字数 721
阅读 30
收藏 5
点赞 0
评论 0

CXF并非能处理任何类型,向Map<String,Object>这样的复杂类型不能帮助开发人员处理,需要开发人员自行处理.


服务端接口和服务组件:

package com.lin.ws.intf;

import java.util.Map;

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

import com.lin.ws.entity.Order;
import com.lin.ws.entity.User;
import com.lin.ws.util.MapXmlHandler;

/**
 * 服务的接口
 * @author lin
 *
 */
//暴露的事这个接口
@WebService
public interface IUserService {
    
    public void addUser(User user);
    
    public User getUserById(Integer id);
    
    public Integer countOfUser();
    
    public Map<String,Order> getOrdersByUser(User user); 

}


package com.lin.ws.impl;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.jws.WebService;

import com.lin.ws.entity.Order;
import com.lin.ws.entity.User;
import com.lin.ws.intf.IUserService;

/**
 * 服务实现类
 * @author lin
 *
 */
//注解指定该服务的接口,和服务的名称
@WebService(endpointInterface="com.lin.ws.intf.IUserService",serviceName="UserService")
public class UserServiceImpl implements IUserService {

    @Override
    public void addUser(User user) {
        
        System.out.println("Add a user:"+user.toString());
    }

    @Override
    public User getUserById(Integer id) {
        
        System.out.println("Get a user by id:"+id);
        
        return null;
    }

    @Override
    public Integer countOfUser() {
        
        Integer count = (new Random()).nextInt();
        
        System.out.println("Return the count of users: "+count);
        
        return count;
    }

    @Override
    public Map<String, Order> getOrdersByUser(User user) {
        
        if(user != null)
        {
            Map<String, Order> orders = new HashMap<>();
            orders.put("order1", new Order(1, "order1", user.getId()));
            orders.put("order2", new Order(2, "order2", user.getId()));
            orders.put("order3", new Order(3, "order3", user.getId()));
            
            return orders;
        }
        return null;
    }

}


发布服务后会报错:


这实际上CXF无法处理接口方法中的那个Map<String,Order>类型:

public Map<String,Order> getOrdersByUser(User user);



那么,需要将Map<String,Order>转化成CXF能帮助处理的类型,在该类型前面加上@XmlJavaTypeAdapter这个annotation

package com.lin.ws.intf;

import java.util.Map;

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

import com.lin.ws.entity.Order;
import com.lin.ws.entity.User;
import com.lin.ws.util.MapXmlHandler;

/**
 * 服务的接口
 * @author lin
 *
 */
//暴露的事这个接口
@WebService
public interface IUserService {
    
    public void addUser(User user);
    
    public User getUserById(Integer id);
    
    public Integer countOfUser();
    
    //CXF 框架无法处理Map<String,Order>类型,需要工程师自行处理
    //需要提供一个转换器,把CXF无法处理的类型转化成CXF可以处理的类型
    //value是需要提供的转换器
    public @XmlJavaTypeAdapter(MapXmlHandler.class) Map<String,Order> getOrdersByUser(User user); 

}


@XmlJavaTypeAdapter的api:


默认参数是一个类型转换器,需要开发人员自行实现:


一个可以和map转化的类:

package com.lin.ws.entity;

import java.util.ArrayList;
import java.util.List;

public class StringOrder {
    
    private List<Entry> entries = new ArrayList<>();
    
    public List<Entry> getEntries() {
        return entries;
    }

    public void setEntries(List<Entry> entries) {
        this.entries = entries;
    }

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

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

        public String getKey() {
            return key;
        }

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

        public Order getValue() {
            return value;
        }

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

}


转化器类:

package com.lin.ws.util;

import java.util.HashMap;
import java.util.Map;

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

import com.lin.ws.entity.Order;
import com.lin.ws.entity.StringOrder;
import com.lin.ws.entity.StringOrder.Entry;

/**
 * StringOrder与,Map<String,Order>相互转换
 * @author lin
 *
 */
public class MapXmlHandler extends XmlAdapter<StringOrder, Map<String, Order>> {

    @Override
    public Map<String, Order> unmarshal(StringOrder v) throws Exception {
        
        //将StringOrder转化成Map<String,Order>
        Map<String, Order> map = new HashMap<String, Order>();
        
        for(StringOrder.Entry entry : v.getEntries())
        {
            map.put(entry.getKey(), entry.getValue());
        }
        return map;
    }

    @Override
    public StringOrder marshal(Map<String, Order> v) throws Exception {
        
        //将Map<String,Order>转化成StringOrder
        StringOrder stringOrder = new StringOrder();
        
        for(String key : v.keySet())
        {
            stringOrder.getEntries().add(new Entry(key, v.get(key)));
        }
        
        return stringOrder;
    }

}


重新发布服务,OK,解决这个问题.

© 著作权归作者所有

共有 人打赏支持
蜡笔小小小新
粉丝 32
博文 104
码字总数 75210
作品 0
深圳
后端工程师
SOA调用wsdl报 No binding operation info while invoking unknown method with params unknown

根据xsd文件用cxf生成对应wsdl,提供给soa调用,soa调用报No binding operation info while invoking unknown method with params unknown 接口模式是订阅发布; 1.想询问如何定位问题;2.想...

cflulu-heixiong ⋅ 06/06 ⋅ 0

NutzBoot v2.1.7 新增 maven 插件和 mqtt-client

NutzBoot v2.1.7 已发布,更新如下: 新增maven插件和mqtt支持 时间: 2018-05-04 事件: 青年节 曲目: Penguin's Game 兼容性: 与2.0.x和2.1.x完全兼容 变更: fix: 修改jetty热加载无效问题 ...

wendal ⋅ 05/04 ⋅ 0

mule发布调用webservice

mule发布webservice 使用mule esb消息总线发布和调用webservice都非常精简,mule包装了所有操作,你只需要拖控件配置就可以,下面讲解mule发布: 1.下面是flow,http监听接口,CXF发布webse...

jiazhipeng12 ⋅ 05/28 ⋅ 0

因为Java10发布所以学些Java8

前言 不知不觉间Java10TM都发布了,看了下新特性,好激动啊,然后回过头来继续工作,叹一口气,看着这个已经上线在改造过程中的Java7项目开始暗自神伤 总想找点代码来写,可是这些年太依赖客...

天下无敌强 ⋅ 03/31 ⋅ 0

Android调用Axis、Axis2、Cxf发布的web service

在Android中调用axis2发布web service过程中一直报http500错误,axis2 web service是用eclipse插件生成的,发现直接打包成war包或直接在eclipse运行,Android调用的时候会报错,一定要打包成...

yuewawa ⋅ 05/04 ⋅ 0

C++ primer第二次阅读学习笔记(第7章:函数)

第七章: 函数 调用函数时如果该函数使用非引用的、非const形参,则既可以给函数传递const实参也可以传递非const实参。虽然函数的形参是const int类型的,但是编译器却将该形参定义为普通的i...

长平狐 ⋅ 2012/10/08 ⋅ 0

MyBatis 实践 -Mapper与DAO

标签: Java与存储 MyBatis简介 MyBatis前身是iBatis,是一个基于Java的数据持久层/对象关系映射(ORM)框架. MyBatis是对JDBC的封装,使开发人员只需关注SQL本身,而不需花费过多的精力去处理如注...

hanqing280441589 ⋅ 2016/02/28 ⋅ 0

C++异常类型以及多级catch

是异常类型,它指明了当前的 catch 可以处理什么类型的异常;是一个变量,用来接收异常信息。当程序抛出异常时,会创建一份数据,这份数据包含了错误信息,程序员可以根据这些信息来判断到底...

陈国成 ⋅ 2017/06/10 ⋅ 0

springmvc学习笔记(22)-springmvc开发小结

springmvc学习笔记(22)-springmvc开发小结 标签: springmvc [TOC] 本文对springmvc系列博文进行小结 springmvc框架 前端控制器:接收request,进行response 处理器映射器:根据url查找Handl...

brianway ⋅ 2016/03/19 ⋅ 2

SICP第四章阅读心得 - Lisp解释器的实现

经过近两个月的苦战,笔者终于将SICP(Structure and Interpretation of Computer Programs(计算机程序的构造和解释))一书读到了第四章过半,开始接触书中关于语言级抽象(metalinguistic abs...

lqt0223 ⋅ 03/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 8分钟前 ⋅ 0

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部