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  控制类中字段和属性的排序。 
XmlAccessorType  控制默认情况下是否对字段或 Javabean 属性进行系列化。 
XmlAttribute   将 JavaBean 属性映射到 XML 属性。 
XmlElement   将 JavaBean 属性映射到派生于属性名称的 XML 元素。 
XmlElementWrapper  生成一个包装 XML 表示形式的包装器元素。 
XmlList    用来将属性映射到列表简单类型。 
XmlMimeType   关联控制属性 XML 表示形式的 MIME 类型。  
XmlRootElement   将类或枚举类型映射到 XML 元素。 
XmlTransient   阻止将 JavaBean 属性映射到 XML 表示形式。 
XmlType   将类或枚举类型映射到 XML 模式类型。 
XmlValue   支持将类映射到带有 simpleContent 的 XML 模式复杂类型或 XML 模式简单类型。







  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值