`

CXF webservice JAXB 处理复杂数据类型方法

 
阅读更多
假定有一个复杂类型如下
public class Client {
private Integer idclientinfo;
private String clientname;
private String tel1;
private String tel2;
private String fax;
private String email;
private String address;
private String city;
private String province;
private String country;
private String mailaddress;
private String owner;
private String corporation_types;
private String switchboard;

private List<List<Object>> childs = new ArrayList<List<Object>>();
private List<String> groups = new ArrayList<String>();
}
假设我们有一个方法 public Client getClient(){

//   return a Client instance;

}

方法返回的是Client的一个实例 JAXB会找到你定义的Client类 ,然后一层层的向复杂类型里面去识别,将复杂类型 分解为一个个的简单类型
对于Integer String 这些基础类型JAXB 已经能为我们很好的处理

对于List<String> 他虽然是接口 ,但他的实例groups 是ArrayList<String> ,这是一个具体类,有自己默认的constructor 那个JAXB也可以为我们处理

对于List<List<Object>> 虽然 childs 是一个具体的ArrayList<List<Object>>();

但是childs里面还嵌套了一个LIst<Object> 这是一个接口类型,如果我们不对其进行处理 JAXB会报如下错误  

List is a interface JAXB can't  handle it

因些我们有如下三种方法去处理


方法1: 用具体的类去wrapper 内部的 List<Object>接口

改写为 

[java] view plaincopy

    public class Type { 
        private List<Object> child = new ArrayList<Object>(); 
     
        public List<Object> getChild() { 
            return child; 
        } 
     
        public void setChild(List<Object> child) { 
            this.child = child; 
        } 
         
     
    } 


[java] view plaincopy

    List<Type> childs = new ArrayList<Type>(); 


这样就把内部的接口List<Object> 给包装成了实际的一个类,这个类里面又维护了一个实际的 child 类型为 ArrayList,child里面又维护了一个实际的Object 他们都不是接口,都是具体的可构造出来的类,并且也保护了多态的特性

方法2:抛弃多态直接用实现类

[java] view plaincopy

    List<ArrayList<Object>> childs = new ArrayList<ArrayList<Object>>(); 


这样改写的话,从外到内都是具体的类,只不过第二层的List失去了多态的特性只能是一个实际的ArrayLIst


方法3:用XmlAdapter 手动处理


新创建一个类 MyXmlAdapter 让他继承自 XmlAdapter


因为JAXB不支持将HashMap 或其他非 JavaBean 类 自然映射到xml表示形式,这样就要定义一个适配器使用java类型适应自定义编组.一般有两步:

1>. 编写一个类继承XmlAdapter,以实现此抽象类的适配器。

2>. 安装使用注释XmlJavaTypeAdapter 的适配器。



类XmlAdapter的说明:

类 XmlAdapter<ValueType,BoundType>

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

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

2个参数目的就是将帮你处理的BoundType通过一定算法处理变成可以处理的ValueType

其两个抽象方法:

marshal(...):编组过程中,JAXB 绑定框架调用 XmlAdapter.marshal(..) 将 bound 类型修改为 value 类型,然后将 value 类型编组为 XML 表示形式。

unmarshal(...):解组过程中,JAXB 绑定框架首先将 XML 表示形式解组为 value 类型,然后调用 XmlAdapter.unmarshal(..) 将 value 类型修改为 bound 类型。



常用的几个注释说明:

a.@XmlJavaTypeAdapter 注释可以与下列编程元素一起使用: JavaBean 属性 、字段、参数 、包 、XmlJavaTypeAdapters 内部的元素 。用来表示使用实现XmlAdapter的适配器,告诉其如何如何转换。

b. @XmlType 注释可以与以下程序元素一起使用:顶层类、枚举类型 。表示将类或枚举类型映射到 XML 模式类型。

c. @XmlAccessorType 注释可以与以下程序元素一起使用:包、顶层类。表示控制默认情况下是否对字段或 Javabean 属性进行序列化。

@XmlAccessorType(XmlAccessType.FIELD)

FIELD :JAXB 绑定类中的每个非静态、非瞬态字段将会自动绑定到 XML,除非由XmlTransient 注释。

d. @XmlElement 注释可以与以下程序元素一起使用: JavaBean 属性、非 static、非 transient 字段 、XmlElements 中的程序元素 。表示将 JavaBean 属性映射到派生于属性名称的 XML 元素。

如:将User接口转化的适配器类:UserAdapter:

[java] view plaincopy

    import javax.xml.bind.annotation.adapters.XmlAdapter; 
      
    /*XmlAdapter<ValueType,BoundType>
     * BoundType - JAXB 不知道如何处理的一些类型。编写一个适配器,以便允许通过 ValueType 将此类型用作内存表示形式。
    ValueType - JAXB 无需其他操作便知道如何处理的类型。
    */ 
    public class UserAdapter extends XmlAdapter<UserImpl, User> { 
       /*marshal表示要将user类型编组为UserImpl类型*/ 
        public UserImpl marshal(User v) throws Exception { 
            if (v instanceof UserImpl) { 
                return (UserImpl)v; 
            } 
            return new UserImpl(v.getUsername(),v.getPassword()); 
        } 
        /*marshal表示要将UserImpl类型解组为具体的类User*/ 
        public User unmarshal(UserImpl v) throws Exception { 
            return v; 
        } 
    } 
      



将Map转化的适配器类:UserMapAdapter.java  和UserMap.java

[java] view plaincopy

    @XmlType(name = "UserMap") 
    @XmlAccessorType(XmlAccessType.FIELD) 
    public classUserMap { 
         @XmlElement(nillable = false, name = "entry") 
         List<UserEntry> entries = new ArrayList<UserEntry>(); 
      
        /**
         * @return the entries
         */ 
        public List<UserEntry> getEntries() { 
           return entries; 
        } 
         @XmlAccessorType(XmlAccessType.FIELD) 
         @XmlType(name = "IdentifiedUser") 
         static class UserEntry { 
                //Map keys cannot be null 
                @XmlElement(required = true, nillable = false) 
                Integer id; 
                User user; 
                public void setId(Integer k) { 
                    id = k; 
                } 
                public Integer getId() { 
                    return id; 
                } 
                public void setUser(User u) { 
                    user = u; 
                } 
                public User getUser() { 
                    return user; 
                } 
            } 
    } 
    public classUserMapAdapter extends XmlAdapter<UserMap,Map<Integer,User>> { 
        @Override 
        public UserMap marshal(Map<Integer, User> v) throws Exception { 
           UserMap  userMap=new UserMap(); 
            for (Map.Entry<Integer, User> e : v.entrySet()) {       
                   UserMap.UserEntry iue = new UserMap.UserEntry(); 
                    iue.setUser(e.getValue()); 
                    iue.setId(e.getKey()); 
                    userMap.getEntries().add(iue); 
                } 
                return userMap; 
        } 
        @Override 
        public Map<Integer, User> unmarshal(UserMap v) throws Exception { 
             Map<Integer, User> map = new LinkedHashMap<Integer, User>(); 
                for (UserMap.UserEntry e : v.getEntries()) { 
                    map.put(e.getId(), e.getUser()); 
                } 
                return map; 
        } 
    } 
      
分享到:
评论

相关推荐

    cxf-webservice复杂类型

    1. **XML与复杂类型映射**:CXF使用JAXB(Java Architecture for XML Binding)将Java对象与XML文档进行绑定,处理复杂的Java类型。例如,Map对象不能直接映射到XML元素,因为XML Schema不支持动态属性的直接表示。 ...

    CXF webservice Demo

    【CXF Webservice Demo】是基于Apache CXF框架的一个示例项目,用于演示如何使用CXF来创建和消费Web服务。Apache CXF是一个开源的Java框架,它允许开发者构建和集成Web服务,支持多种Web服务标准,如SOAP、RESTful ...

    CXF WebService 所需要的最少的jar包

    `jaxb-api.jar`是JAXB规范,`jaxb-impl.jar`和`activation.jar`是其实现,它们允许CXF处理XML数据。 4. **JAX-RS**: Java API for RESTful Web Services,用于构建RESTful服务。`jaxrs-api.jar`包含了JAX-RS规范,`...

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

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

    cxf-webservice 最简单的

    【CXF Webservice 最简单的应用详解】 Apache CXF 是一个开源的 Java 框架,主要用于构建和开发 Web 服务。它提供了丰富的功能,包括支持多种 Web 服务规范,如 SOAP、RESTful API 和 JAXB,使得创建和消费 Web ...

    CXF开发webservice服务端

    该类需要使用JAXB注解进行标记,以便CXF框架能够正确处理其序列化和反序列化的过程。 ```java package entity; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation....

    WebService开发客户端 cxf方式

    1. **数据绑定**:CXF支持JAXB(Java Architecture for XML Binding)进行数据绑定,可以将XML数据自动转换为Java对象,反之亦然,简化了数据处理。 2. **安全性**:CXF提供多种安全机制,如SSL/TLS加密、WS-...

    cxf webservice所需jar包

    - CXF支持多种数据绑定机制,如JAXB(Java Architecture for XML Binding)用于XML到Java对象的自动转换,以及XMLBeans和Aegis等其他选项。 7. **客户端API**: - CXF提供了强大的客户端API,可以直接生成客户端...

    CXF webService所需要的jar包

    这个版本的JAXB实现了JSR 222,用于数据绑定和XML序列化,是CXF处理XML数据的重要组件。 3. **wss4j-1.5.11.jar**:Web Services Security for Java(WSS4J)是Apache提供的安全框架,它为CXF提供了Web服务安全支持...

    WebService CXF 对应版本及资源

    WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- 3.2之前版本 java 6 3.1 ...

    cxf WebService jar包(2)

    它提供了一种高效、类型安全的方式来处理XML数据,特别适合那些需要频繁读写XML的项目。 4. **jaxb-impl-2.1.12.jar**:这是JAXB的实现库,包含JAXB的运行时组件,用于在Java应用程序中执行XML绑定操作。 5. **js-...

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

    CXF集成了JAXB,使得在处理XML消息时,无需编写大量的转换代码。 在提供的压缩包“ws_test”中,很可能包含了使用CXF实现的Web服务示例,包括JAX-WS和JAX-RS的服务端点,以及使用JAXB进行数据交换的类。这个实例...

    Webservice笔记含使用cxf和jaxws两种方式开发webservice【源代码+笔记】

    第一天: 什么是webservice? 从案例(便民查询网站... 测试jaxws传输复杂对象类型 CXF开发webservice: CXF入门程序 Spring+cxf整合(重点) CXF发布rest的webservice。(重点) 综合案例: 实现便民查询网站

    WebService CXF 对象传递 附

    **WebService CXF 对象传递详解** ...了解这些基础知识,开发者可以更高效地创建和使用Web服务,实现复杂数据类型的交互。在实际项目中,结合源码分析和相关工具,能更好地理解和优化CXF的服务实现。

    cxf webservice整体jar包

    6. **插件体系**:CXF拥有强大的插件系统,可以扩展其功能,如支持不同的数据绑定框架(如JAXB、Aegis等),以及与其他Spring框架的深度集成。 7. **调试和测试工具**:CXF提供了方便的工具,如WS-Trust STS模拟器...

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

    - SOAP(Simple Object Access Protocol)是Web Service常用的数据交换格式,使用XML编码消息,具有强类型和结构化的特性。在CXF中,可以很容易地处理SOAP消息。 - RESTful风格的Web Service则更轻量级,通常用于...

    WebService CXF 详细教程

    3. **数据绑定**:CXF支持JAXB和XMLBeans等多种数据绑定技术,简化了XML与Java对象之间的转换。 4. **动态客户端生成**:CXF可以从WSDL生成客户端代码,使得调用服务如同调用本地方法一样简单。 5. **模块化设计**:...

    cxf开发webservice所用jar包

    这个标题“cxf开发webservice所用jar包”表明我们正在讨论一组CXF框架所需的JAR文件,这些文件对于利用CXF开发基于Web服务的应用程序至关重要。在描述中提到“cxf-2.4.1整合spring3.0所用jar包”,这暗示了我们使用...

    WebService_CXF范例.

    同时,它支持多种数据绑定机制,如JAXB 2.x、Aegis、XMLBeans和SDO,并能处理XML、JSON、FastInfoset等多种数据格式。在传输层,CXF支持SOAP、REST/HTTP,以及通过HTTP、Servlet、JMS等多种方式传递数据。 部署方面...

    CXF webservice初学笔记

    1. `jaxb-xjc-2.2.1.1.jar` 和 `jaxb-impl-2.2.1.1.jar`:这是Java Architecture for XML Binding (JAXB) 的实现,用于XML到Java对象和反之的转换,是CXF处理XML数据的关键组件。 2. `freemarker-2.3.13.jar`:...

Global site tag (gtag.js) - Google Analytics