CXF webService 对象属性值为null或空时生成xml缺少该字段节点
? ? ? 最近在做一个Android项目,需要用到webservice,在使用cxf开发webService时发现一个问题,比如我现在有一个Building对象,其中name属性值可能为null或空,在building对象生成xml文件时发现 当name属性值为null时:生成的xml会缺少<name></name>这个节点,在Android客户端解析xml时就会报空指针错; 当name属性值为“”空时:生成的xml中name节点是这样的<name/>这个形式也并不是我想要的,因为Android解析name时会得到name=anyType{}这样的形式,明显是不对的。我们需要的格式应该是<name></name>这样形式的。 在网上查了好多资料说xml默认的处理方式就是这样的,需要我们自己重写xml处理方式,后来在网上看到了这篇文章解决了我的问题,请参考 http://www.boyunjian.com/do/article/snapshot.do?uid=2819102595941137602 http://www.cnblogs.com/fragranting/archive/2012/03/25/xml--jaxb.html 主要是使用了jax-ws数据映射提供 XML 模式和 Java 之间的映射,在这里我用到的是javax.xml.bind.annotation这个类, 1、我们首先需要去写一个class该类继承XmlAdapter抽象类: 如下:在这里我把值为null或""空的数据转化为了" "(空格输出)这样就可以生成我们需要的xml
package com.hbmop.app.util; import javax.xml.bind.annotation.adapters.XmlAdapter; public class DataAdapter extends XmlAdapter<Object,Object>{ //java→xml时的处理,ob是Java生成xml时传入的属性值,ob可以数组、集合等其它复杂类型, //在这个方法中可以对其进行处理,return返回需要的结果类型 @Override public Object marshal(Object ob) throws Exception { if(ob == null || ob.equals("")){ ob=" "; } return ob; } //xml→java时的处理 @Override public Object unmarshal(Object arg0) throws Exception { // TODO Auto-generated method stub return arg0; } }2、使用基于j avax.xml.bind.annotation这个类的注解 @XmlElement选项包括: Required:该元素节点是否必须存在?例如,minOccurs 是否不等于 1? Nillable:该字段是否包含 nillable="true" 属性 ,如果nillable() 为 true,那么 JavaBean 属性被映射到 XML 模式 nillable 元素声明
</pre><p><pre name="code" class="java">@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name="Building") public class Building { @XmlJavaTypeAdapter(value = DataAdapter.class) @XmlElement(required=true,nillable=true) private String name; public String getName() { return name; } public void setName(String name) { this.name = name; }} 经过上述两步处理,即可实现我们想要的xml格式 主要的Annotation XmlAccessorOrder??控制类中字段和属性的排序。? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |