`

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

    博客分类:
  • java
 
阅读更多

 一些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 wcp

 * @version 创建时间:2011-12-4 下午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<Object, Object> entry)

        {

            super();

            this.key = entry.getKey();

            this.value = entry.getValue();

        }

 

        public MapEntry(Object 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 wcp

 * @version 创建时间:2011-12-4 下午11:25:11

 * @DO       Map适配器       

 */

 

public class MapAdapter extends XmlAdapter<MapConvertor, Map<Object, Object>>

{

 

   @Override
 public MapConvertor marshal(Map<Object, Object> map) throws Exception {
  MapConvertor convertor = new MapConvertor();
  for(Map.Entry<Object, Object> entry:map.entrySet()){
   MapConvertor.MapEntry e = new MapConvertor.MapEntry(entry);
   convertor.addEntry(e);
  }
  return convertor;
 }

 @Override
 public Map<Object, Object> unmarshal(MapConvertor map) throws Exception {
  Map<Object, Object> result = new HashMap<Object,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的支持。

分享到:
评论

相关推荐

    cxf-webservice复杂类型

    2. **自定义数据类型**:对于像Map这样的复杂类型,开发者可以创建自定义的数据类型来映射XML元素。这通常涉及到创建一个Java类,该类具有一个或多个属性,用于存储Map的键值对,并通过注解这些属性来指示CXF如何...

    CXF-JAXB包的处理问题

    而JAXB(Java Architecture for XML Binding)是Java平台的标准,用于将XML数据与Java对象之间进行绑定,使得开发者可以方便地在XML文档和Java对象之间转换。在处理CXF与JAXB的集成时,有时会遇到版本冲突的问题,...

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

    然而,CXF在默认情况下并不支持所有类型的复杂数据类型,尤其是如Map、List这样的集合类型。当我们在服务接口中使用这些类型作为参数或返回值时,可能会遇到问题,因为CXF可能无法正确地序列化和反序列化它们。 ...

    04.使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值

    在实际应用中,我们需要在CXF服务端创建服务接口和实现,然后通过JAXB(Java Architecture for XML Binding)进行数据绑定。JAXB会自动将Java对象转换为XML,反之亦然。在服务接口中,可以定义如下的方法: ```java...

    Cxf转换器示例

    1. **转换器实现**:开发者可能会定义一个或多个类,这些类实现了`org.apache.cxf.converters.Converter`接口,以便处理特定数据类型的转换。 2. **注册转换器**:为了让CXF知道如何使用这些转换器,开发者需要在...

    webservice实例 CXF的JAXWS和JAXRS实现 及JAXB标准接口实现带jar包

    在提供的压缩包“ws_test”中,很可能包含了使用CXF实现的Web服务示例,包括JAX-WS和JAX-RS的服务端点,以及使用JAXB进行数据交换的类。这个实例可能是全部手写的,意味着它提供了一整套从创建服务到处理请求和响应...

    apache-cxf-3.1.18.zip

    - **强大的数据绑定**:CXF使用JAXB进行XML到Java对象的自动转换,简化了数据处理。 - **良好的社区支持**:由于是开源项目,Apache CXF拥有活跃的开发者社区,能及时解决用户遇到的问题。 总的来说,Apache CXF是...

    cxf 完整的服务端客户端

    - Aegis:CXF 内置的数据绑定引擎,支持非标准的 Java 对象序列化。 通过这个“cxf 完整的服务端客户端”示例,你可以深入理解 CXF 如何处理服务发布、服务消费、数据绑定、异常处理等核心功能,并能更好地掌握 Web...

    cxf-core-3.2.4_cxf_源码

    CXF支持JAXB、Aegis等多种数据绑定机制。 6. **Message**:CXF中的消息模型用于表示通信中的数据,包括请求和响应。 在源码`cxf-core-3.2.4`中,我们可以看到以下几个关键模块: 1. **spi**:服务提供接口,定义了...

    Apache CXF之结合Spring配置发布WebServices(Aegis数据绑定)

    Aegis数据绑定支持基本的数据类型、集合、Map以及自定义的Java类,为开发者提供了一种灵活的方式来处理Java对象和服务之间的转换。 以下是使用Apache CXF结合Spring发布Web Services(Aegis数据绑定)的基本步骤: ...

    cxf开发map的demo

    2. **Map类型在CXF中的处理**:在CXF中,Map对象可以通过JAXB(Java Architecture for XML Binding)进行序列化和反序列化,使得Map可以在XML消息中传输。JAXB将Java对象转换为XML,反之亦然,这样Map就可以被作为...

    jaxb-api.jar.jaxws-api.zip_ jaxb-api.jar_cxf_jax-ws.jar_jaxb-api

    **JAXB(Java Architecture for XML Binding)** 是Java平台的一个标准,它允许开发者将XML文档和Java对象进行绑定,从而简化XML数据的处理。在Java 6中,JAXB是内置的API,但在更新的JDK版本中,它被移除了,转而...

    cxf-rt-databinding-jaxb-3.0.1-API文档-中文版.zip

    赠送jar包:cxf-rt-databinding-jaxb-3.0.1.jar; 赠送原API文档:cxf-rt-databinding-jaxb-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-databinding-jaxb-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-...

    基于Apache CXF构建SOA应用 随书源代码

    覆盖以下内容:基于JAX-WS规范和CXF自身的前端模式实现,CXF支持的数据绑定(DataBindings),CXF支持的WSDL绑定,CXF支持的传输协议绑定。CXF的调式、配置、日志、发布和工具。CXF实现RESTful服务。CXF对WS-* 的...

    基于CXF的webService本地数据交互----PC端与Android端(二)

    - CXF的JAXB和XML绑定工具:用于处理数据序列化和反序列化。 总结,通过Apache CXF,我们可以轻松地在PC端和Android端之间建立Web Service通信,实现数据的高效交互。理解并掌握这些知识点对于跨平台应用开发至关...

    cxf基本jar包

    - `cxf-rt-databinding-jaxb.jar`:JAXB数据绑定支持。 - `cxf-rt-rs-extension-providers.jar`:RESTful服务的额外提供者。 以上就是关于CXF基本jar包的详细说明。在实际开发中,根据项目的具体需求,可能还需要...

    spring,cxf,restful发布webservice传递List,Map,List&lt;Map&gt;

    在CXF中,可以通过JAXB(Java Architecture for XML Binding)将Java对象转换为XML格式,以便在网络间传输。例如,如果你有一个包含List&lt;Map, String&gt;&gt;的对象,JAXB会将其转换为XML元素结构。 以下是发布带有复杂...

    apache-cxf2.7.18官方版最稳定版本

    5. **数据绑定**:CXF支持多种数据绑定技术,如JAXB(Java Architecture for XML Binding)用于XML到Java对象的映射,以及Aegis绑定,用于非JAXB对象的XML处理。 6. **安全功能**:CXF提供了全面的安全性支持,包括...

    cxf3.2.0 webservice 最少jar包

    - `cxf-rt-databinding-jaxb.jar`:提供JAXB数据绑定支持,用于XML和Java对象之间的转换。 - `cxf-rt-rs-client.jar`(如果需要支持RESTful服务):用于构建RESTful客户端。 - `jaxb-api.jar` 和 `jaxb-impl.jar`...

    cxf-2.4.2 jar包

    4. **数据绑定**:CXF支持多种数据绑定技术,如JAXB(Java Architecture for XML Binding),用于将XML数据与Java对象之间进行自动转换。 5. **WS-Security**:CXF提供了对Web服务安全标准(如WS-Security、WS-...

Global site tag (gtag.js) - Google Analytics