java - BeanUtils.copyProperties 忽略空值

标签 java xstream apache-commons-beanutils

我有以下类(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/

相关文章:

java - 如何通过 Rest 模板调用在另一个端口中运行的服务 API?

java - 我如何知道 Oracle 诊断包和 Oracle 调优包是否随 Oracle 安装一起安装?

java - 将项目转换为分面形式后导入无法解决

java - XStream Java显示进度

generics - 如何让 XStream 很好地输出 Scala 列表?我可以编写自定义转换器吗?

java - BeanUtils : populate String Date formatted map field to Date property

java - 访问 bean 的嵌套/索引属性时如何防止 NPE

java - Wicket 口的类别面板

java - 使用 xstream 将 xml 作为字符串而不是类获取

shiro - 如何在 Apache Shiro 中配置 SameSite Cookie 属性?