如何在访问bean的嵌套/索引属性时阻止NPE

时间:2010-05-02 10:57:55

标签: java apache-commons-beanutils nested-properties

有没有办法在使用commons-beanutils访问嵌套bean时阻止NPE? 这是我的代码:

new BeanUtilsBean().getProperty(human, "parent.name");

在这种情况下,我希望getProperty()human.getParent() == null时返回空字符串(“”),或者以抛出NPE的方式处理它。

3 个答案:

答案 0 :(得分:2)

他们正在考虑JDK7的adding语言功能,但ultimately they weren't added

现在你必须手动检查。你可以破解它并创建一个像

这样的函数
public static void propertyHack(Object bean, String property, String nullreplace){
  try{
    return new BeanUtilsBean().getProperty(bean, property);
  }
  catch(NullPointerException npe){
    return nullreplace;
  }
}

有点糟糕,但它会起作用。

答案 1 :(得分:2)

PropertyUtils有一个嵌套属性getNestedProperty(...)的特定方法,它通过抛出NestedNullException来处理NPE,这对于眼睛来说可能更好(?)。

这是Javadoc

答案 2 :(得分:1)

如果其他人正在搜索答案

    Guia g = new Guia();
    GuiaParticipante gp = new GuiaParticipante(1);
    g.setTbGuiaParticipanteCollection(Collections.singletonList(gp));//comment this line to test
    String name = "tbGuiaParticipanteCollection[0].codParticipante";//the expression itself
    Resolver resolver = new DefaultResolver();//used to "clean" the expression
    if (resolver.isIndexed(name)) {
        String property = resolver.getProperty(name);//remove the [0].codParticipante

        if (PropertyUtils.getProperty(g, property) != null) { //get the collection object, so you can test if is null
            String cod = BeanUtils.getNestedProperty(g, name); //get the value if the collection isn't null
            System.out.println(cod);
        }
    }