Как предотвратить NPE при доступе к вложенному/индексированному свойству боба
-
02-10-2019 - |
Вопрос
Есть ли способ предотвратить NPE при доступе к вложенному бобу с использованием Commons-Beanatils? Вот мой код:
new BeanUtilsBean().getProperty(human, "parent.name");
В этом случае я хочу getProperty()
чтобы либо вернуть пустую строку (""), когда human.getParent() == null
Или справиться с этим так, как и другие, которые бросают NPE.
Решение
Они думали о добавление Языковые функции для JDK7, но в конечном итоге они не были добавлены
Пока вам придется проверить вручную. Вы можете просто взломать его и создать функцию, подобную
public static void propertyHack(Object bean, String property, String nullreplace){
try{
return new BeanUtilsBean().getProperty(bean, property);
}
catch(NullPointerException npe){
return nullreplace;
}
}
Вроде отстой, но это сработает.
Другие советы
PropertyUtils
имеет конкретный метод для вложенных свойств getNestedProperty(...)
это обрабатывает NPE, бросая NestedNullException
, что, вероятно, (?) Лучше для глаза.
Здесь Javadoc.
Если кто -то другой ищет ответ
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);
}
}