2

我有以下课程:

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,以避免空指针错误 - bean 实际上要复杂得多,我不想检查“是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... 但忽略空属性而不是覆盖它们?

4

2 回答 2

3

您可以创建一个自定义转换器,为 null 属性创建默认值:

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);

您的代码现在可以工作了。唯一可能困扰您的是您的 Something 被初始化两次。不知道这样行不行...

顺便说一句,如果您想对流程进行更细粒度的控制:请改用 BeanUtilsBean、PropertyUtilsBean 和 ConvertUtilsBean。

于 2010-12-10T14:38:18.163 回答
0

您可以使用 xstream 别名方法将属性名称映射到类。以下链接会更有帮助 http://x-stream.github.io/alias-tutorial.html

于 2010-12-10T13:53:39.523 回答