gpt4 book ai didi

java - BeanUtils.copyProperties 忽略空值

转载 作者:行者123 更新时间:2023-12-04 06:39:44 54 4
gpt4 key购买 nike

我有以下类(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 实际上要复杂得多,而且我不想检查“是 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 ...但忽略空属性而不是覆盖它们?

最佳答案

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

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。

关于java - BeanUtils.copyProperties 忽略空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4409310/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com