我有以下类(class):
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 实际上要复杂得多,并且我不想检查“is something != null
?”一百万次。
当我使用 XML 构造函数时出现问题。假设我有以下 XML:
<myBean>
<name>John</name>
</myBean>
这就是我希望构造函数执行的操作:
name: "John";
something: new Something();
但是,由于没有<something>
XML 中的 BeanUtils.copyProperties 元素使 something = null;
,因此我得到的是:
name: "John"
something: null
如何复制beanFromXML
的属性为this
...但是忽略 null 属性而不是覆盖它们?
最佳答案
您可以创建一个自定义转换器,为 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。
关于java - BeanUtils.copyProperties 忽略空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4409310/