2010-12-10 178 views
2

我有下面的类:BeanUtils.copyProperties忽略空值

import org.apache.commons.beanutils.BeanUtils; 
import com.thoughtworks.xstream.XStream; 
... 

public class MyBean { 
    protected static final XStream XSTREAM = new XStream(new DomDriver()); 

    protected String name; 
    protected Something something; 

    public MyBean() { 
     something = new Something(); 
    } 

    public MyBean(String xml) { 
     this(); 
     MyBean beanFromXML = (MyBean) XSTREAM.fromXML(new StringReader(xml)); 
     BeanUtils.copyProperties(this, beanFromXML); 
    } 

    public String toString() { 
     return XSTREAM.toXML(this); 
    } 

    // Getters and setters... 
} 

这是一个与序列化和使用的XStream从XML反序列化/能力的bean。

我还添加了非参数的构造函数初始化something,避免空指针错误 - 豆实际上是一个复杂得多,我不希望被检查“是something != null?”一百万次。

当我使用XML构造函数时出现问题。比方说,我有以下XML:

<myBean> 
    <name>John</name> 
</myBean> 

这是我想的构造做:

name: "John"; 
something: new Something(); 

但是,由于是在XML没有<something>元素,BeanUtils.copyProperties品牌something = null;,所以我得到的是:

name: "John" 
something: null 

我如何复制beanFromXML的属性为this ...但忽略NUL l属性而不是覆盖它们?

回答

3

您可以创建创建空的属性,默认值的自定义转换器:

public class MyNullConverter implements Converter { 
    @Override 
    public Object convert(final Class type, final Object value) { 
    try { 
     return value == null ? type.newInstance() : value; 
    } catch (final InstantiationException e) { 
     return null; 
    } catch (final IllegalAccessException e) { 
     return null; 
    } 
    } 
} 

然后将其注册为要默认的空值bean类:

ConvertUtils.register(new MyNullConverter(), Something.class); 

您的代码现在可以使用。唯一可能会影响你的是,你的东西会被初始化两次。不知道这是否正确...

顺便说一句,如果你想要一个更细粒度的控制过程:使用BeanUtilsBean,PropertyUtilsBean和ConvertUtilsBean来代替。

+0

我会试一试(但它将不得不等待下个星期一:D)。至于初始化发生两次,这不是问题,但无论如何它必须很容易解决。谢谢!!! :) – AJPerez 2010-12-10 16:02:49

+0

太棒了,现在正在工作。再次感谢你的帮助! :) – AJPerez 2010-12-13 07:44:28

0

您有xstream别名方法将属性名称映射到类。 下面的链接将变得更加有用 http://x-stream.github.io/alias-tutorial.html

+0

这不是OP所要求的....问题是:如何将beanFromXML的属性复制到此...但忽略空属性而不是覆盖它们? – 2010-12-10 14:00:38