复制字段但跳过空值的时尚方式

时间:2013-02-07 10:31:59

标签: java pojo

我正在将XML读入JAXB pojos并希望将字段合并到我的实体pojos中。但是,如果XML中的值为null(即XML中不存在该值),我不想覆盖现有值。所以现在我有很多这样的代码:

        if (addressDetails.getNAME1() != null) {
            org.setName1(addressDetails.getNAME1());
        }
        if (addressDetails.getNAME2() != null) {
            org.setName2(addressDetails.getNAME2());
        }
        if (addressDetails.getNAME3() != null) {
            org.setName3(addressDetails.getNAME3());
        }

这是丑陋的,嘈杂的,声纳对于圈复杂性的尖叫声。你会怎么做呢?想到的事情:

  • util使用反射(慢而不是类型安全)
  • 实体类的包装类(详细,样板文件)

我的目标是可读性和没有大量​​额外代码。

3 个答案:

答案 0 :(得分:1)

查看Google的Guava代码库。它有一些处理空值的实用方法。

答案 1 :(得分:0)

这是一个基于Spring的BeanUtils class

的灵活但解决方案
PropertyDescriptor[] descriptors = getPropertyDescriptors(YourSourceClass.class);
List<String> ignoredProperties = new ArrayList<String>();
for(PropertyDescriptor pd : descriptors){
    if(pd.getReadMethod().invoke(yourSourceObject) == null){
        ignoredProperties.add(pg.getBaseName());
    }   
}

BeanUtils.copyProperties(yourSourceObject, yourTargetObject, ignoredProperties.toArray());

它为您可能想要设置的每个字段编写显式空检查,getter和setter。

如果你想避免反思,你可以缩短这个结构:

if (addressDetails.getNAME3() != null) {
        org.setName3(addressDetails.getNAME3());
}

使用像Guava的Objects.firstNonNull

这样的实用方法
 org.setName3(Objects.firstNonNull(addressDetails.getNAME3(), org.getName3()));

这不会帮助您避免为每个属性写一行,但无论如何它都会大大缩短代码。

答案 2 :(得分:-1)

我建议使用Reflection(通过BeanUils种类库),这可以很好地完成这项工作。