代码之家  ›  专栏  ›  技术社区  ›  Kannan Ekanath

如何要求beanutils忽略空值

  •  13
  • Kannan Ekanath  · 技术社区  · 14 年前

    使用commons beanutils,我想知道如何请求任何转换器,比如说dateconverter忽略空值并使用空值作为默认值。举个例子,考虑一个公共类,

    public class X {
        private Date date1;
        private String string1;
        //add public getters and setters
    }
    

    我的转换器测试为,

    public class Apache {
    
        @Test
        public void testSimple() throws Exception {
            X x1 = new X(), x2 = new X();
            x1.setString1("X");
            x1.setDate1(null);
            org.apache.commons.beanutils.BeanUtils.copyProperties(x2, x1);
            //throws ConversionException
            System.out.println(x2.getString1());
            System.out.println(x2.getDate1());
        }
    }
    

    上面抛出了一个NPE,因为日期恰好为空。在我看来,这是一个非常原始的场景,应该在默认情况下进行处理(如中所述,我希望x2的date1值为空)。医生告诉我我可以问 converter 这样做。有人能给我指出最好的方法吗?

    我不想让Converter和IsuseDefault()保持为真,因为我必须为所有日期、枚举和许多其他转换器执行此操作!

    5 回复  |  直到 9 年前
        1
  •  39
  •   Kannan Ekanath    14 年前

    显然,有一种方法可以告诉convertutils不要对空值抛出异常,这是通过调用

    BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);
    
        2
  •  10
  •   Diego Plentz    10 年前

    最好的解决方案是更新到beanutils 1.9.0,因为正如您在这里看到的,这个问题已经解决了。 https://issues.apache.org/jira/browse/BEANUTILS-454

        3
  •  2
  •   Ninju Bohra    12 年前

    也许有点晚了,但看起来你可以注册一个日期转换器 https://issues.apache.org/jira/browse/BEANUTILS-387

        4
  •  1
  •   James-Jesse Drinkard    11 年前

    我最近遇到这个问题,只是将变量转换为字符串以避免这个错误,并在需要时将其转换回日期。不是最优雅的解决方案,但为了简单和避免这样的问题,这是一个可行的解决方案。另一个警告是beanutils会在我的类加载之前启动它的方法,所以我选择了这个方法,而不是使用自定义类加载程序来解决这个问题。

    顺便说一下,在verion 1.8.0之前,beanutils本身会忽略这些空值。

    看到这个链接: No value specified for 'Date' when the field is a java.util.Date with a null value 详细解释。

        5
  •  0
  •   Marc    9 年前

    我有点惊讶于这样一个简单的例子,比如在bean中设置一个空值,比如:

    BeanUtils.setProperty(pojo, "date", null);
    

    导致崩溃行为,如上所述。

    值得一提的是,我的解决方法是:

    import org.apache.commons.beanutils.BeanMap;
    
    BeanMap beanMap = new BeanMap(pojo);
    Method writeMethod = beanMap.getWriteMethod("date");
    writeMethod.invoke(pojo, null);