首页 > 其他分享 >在CXF中用JAXB数据绑定支持Map类型

在CXF中用JAXB数据绑定支持Map类型

时间:2023-08-28 10:34:49浏览次数:47  
标签:MapConvertor Map CXF JAXB value key import public


 

一些java类型不能自然映射成xml,例如,HashMap 或其他非 JavaBean 类,这个时候可以覆盖XmlAdapter来自定义转换方法。

XMlAdapter讲解:

 

javax.xml.bind.annotation.adapters 

类 XmlAdapter<ValueType,BoundType>

 

类型参数:

BoundType - JAXB 不知道如何处理的一些类型。编写一个适配器,以便允许通过 ValueType 将此类型用作内存表示形式。

ValueType - JAXB 无需其他操作便知道如何处理的类型。

 

 

引入:

在CXF所些的服务端程序,被客户端程序调用时,SOAP中不支持Map(客户端传递Map参数或服务端返回Map数据),否则会如下错误:Marshalling Error: java.util.Map is not known to this context。

 

原因:

CXF中不支持Map

 

解决方案:

通过适配器将数组转换成HashMap的方式支持。

 

代码实现:

1、  定义Map转换器(code)import java.util.ArrayList;

import java.util.List;
import java.util.Map;
 
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
 
/**
 * @author TEANA E-mail: [email protected]
 * @version 创建时间:2011-7-1 下午11:21:49
 * @DO      Map转换器        
 */
@XmlType(name = "MapConvertor")  
@XmlAccessorType(XmlAccessType.FIELD) 
public class MapConvertor
{
    private List<MapEntry> entries = new ArrayList<MapEntry>();
 
    public void addEntry(MapEntry entry)
    {
        entries.add(entry);
    }
 
    public static class MapEntry
    {
        public MapEntry()
        {
            super();
        }
 
        public MapEntry(Map.Entry<String, Object> entry)
        {
            super();
            this.key = entry.getKey();
            this.value = entry.getValue();
        }
 
        public MapEntry(String key, Object value)
        {
            super();
            this.key = key;
            this.value = value;
        }
 
        private String key;
        private Object value;
 
        public String getKey()
        {
            return key;
        }
 
        public void setKey(String key)
        {
            this.key = key;
        }
 
        public Object getValue()
        {
            return value;
        }
 
        public void setValue(Object value)
        {
            this.value = value;
        }
    }
 
    public List<MapEntry> getEntries()
    {
        return entries;
    }
}

 2、  定义Map适配器(code)import java.util.HashMap;

import java.util.Map;
 
import javax.xml.bind.annotation.adapters.XmlAdapter;
 
/**
 * @author TEANA E-mail: [email protected]
 * @version 创建时间:2011-7-1 下午11:25:11
 * @DO       Map适配器       
 */
 
public class MapAdapter extends XmlAdapter<MapConvertor, Map<String, Object>>
{
 
    @Override
    public MapConvertor marshal(Map<String, Object> map) throws Exception
    {
        MapConvertor convertor = new MapConvertor();
        for (Map.Entry<String, Object> entry : map.entrySet())
        {
            MapConvertor.MapEntry e = new MapConvertor.MapEntry(entry);
            convertor.addEntry(e);
        }
        return convertor;
    }
 
    @Override
    public Map<String, Object> unmarshal(MapConvertor map) throws Exception
    {
        Map<String, Object> result = new HashMap<String, Object>();
        for (MapConvertor.MapEntry e : map.getEntries())
        {
            result.put(e.getKey(), e.getValue());
        }
        return result;
    }
}

 3、  在CXF服务端的接口程序中进行如下定义@WebMethod 

@XmlJavaTypeAdapter(MapAdapter.class)  
Map<String, String> getMap();

 进行以上3个步骤,就可以实现CXF中对Map的支持。

 

 


标签:MapConvertor,Map,CXF,JAXB,value,key,import,public
From: https://blog.51cto.com/u_16237557/7260858

相关文章

  • Shadow Mapping (Games202)
    ShadowMapping(Games202)2-PassAlgorithmPass1.RenderfromLightPass1需要知道光线能照射到的点,也就是从光源所在的视角去渲染模型,有哪些是能被渲染出,哪些会被遮挡住而不被渲染。我们知道深度测试所做的就是从CameraView去看哪些点是能被看到,忽略那些被遮挡的点。所以......
  • github.com/mitchellh/mapstructure 教程
    官网链接:github.com/mitchellh/mapstructure本文只是简单的记录下mapstructure库的简单使用,想更加详细的学习,点击Godoc学习吧。文中内容基本都是来自后面的参考链接。github.com/mitchellh/mapstructure是一个用于将通用的map值解码为结构体(struct)并进行错误处理的Go......
  • AutoMapper (将实体转dto 或 将dto 转成实体)
    第一步:  安装nuget包1、AutoMapper.Extensions.Microsoft.DependencyInjection(依赖注入扩展包)2、AutoMapper (核心) 第二步:创建一个类1、添加一个类文件  起名为RbacProfile.cs这样一文件2、RbacProfile需要继承 Profile 父类3、RbacProfile添加一个构造函数第三......
  • Semaphore的使用
    基本介绍多线程中上锁的目的一般是一种对受限资源的保护,例如:保证同一时刻只有一个线程能访问的ReentrantLock,或者保证只有一个线程可以写入的ReadWriteLock还有一种受限资源,它需要保证同一时刻最多有N个线程能访问,比如同一时刻最多创建100个数据库连接,最多允许10个用户下载等这种限......
  • ArcMap用一个面要素擦除另一个面要素的部分
      本文介绍在ArcMap软件中,基于擦除(“Erase”)工具,对矢量面要素的部分区域加以剔除的操作。  假如我们已知这样一个研究区域,其包括了陆地与水体两个部分。  与此同时,我已经基于MNDWI,以0.20为阈值提取出了上述研究区域内部及其周边区域的水体,也就是下图中的蓝色部分。在这里......
  • 使用哪种注解处理后台Map参数类型,探究前端发送请求URL限制
    如何处理接口参数是Map类型探究URL限制法1:前端发送Get请求需求:为了得到分页结果,我将分页时需要的参数封装到Map中进行传递@GetMapping("/page")publicRqueryPage(@RequestParamMap<String,Object>params){}//1.测试GEThttp://localhost:8080/product/categorybrandrel......
  • [宿舍管理模块】的催起事件的热力图(heatmap)设计
    授课老师可以上午第一节开始时或下午第一节开始时,通过平台[教学课堂管理]发起一个可选的催起消息,此消息可以可以发至班主任或宿管或特殊管理员,最好由宿管去完成这个催起任务,班主任也许正在授课,会出现冲突。当宿管通过平台的[宿舍管理模块]接收到他所负责的宿舍的多个班级多个......
  • .NET6 使用 AutoMapper
    一、Net6环境下的.netcore项目里如何使用AutoMapper实现依赖注入。注: AutoMapper是一个对象-对象映射器,可以将一个对象映射到另一个对象。第一步,在Nuget引入AutoMapper、AutoMapper.Extensions.DependencyInjection这两个NuGet包 第二步,定义Profile,方便......
  • .NET6 配置 AutoMapper 与 AutoFac
    AutoMapper一、Net6环境下的.netcore项目里如何使用AutoMapper实现依赖注入。注:AutoMapper是一个对象-对象映射器,可以将一个对象映射到另一个对象。第一步,在Nuget引入AutoMapper、AutoMapper.Extensions.DependencyInjection这两个NuGet包 第二步,定义Prof......
  • 【Java】Mapper # 和$的区别
    #'防止依赖注入'#是将传入的值当做字符串的形式,#防止依赖注入$是将传入的数据直接显示生成sql语句https://blog.csdn.net/hao65103940/article/details/79099159......