Java Beans, BeanUtils и класс Boolean wrapper
Я использую BeanUtils для управления объектами Java, созданными через JAXB, и у меня возникла интересная проблема. Иногда JAXB создает объект Java следующим образом:
public class Bean {
protected Boolean happy;
public Boolean isHappy() {
return happy;
}
public void setHappy(Boolean happy) {
this.happy = happy;
}
}
Следующий код работает очень хорошо:
Bean bean = new Bean();
BeanUtils.setProperty(bean, "happy", true);
Однако попытка получить свойство happy
так:
Bean bean = new Bean();
BeanUtils.getProperty(bean, "happy");
Результаты в этом исключении:
Exception in thread "main" java.lang.NoSuchMethodException: Property 'happy' has no getter method in class 'class Bean'
Изменение всего на примитив boolean
позволяет работать как с набором, так и с вызовом. Однако у меня нет этого параметра, так как это сгенерированные классы. Я предполагаю, что это происходит, потому что библиотеки Java Bean рассматривают только метод is<name>
для представления свойства, если тип возврата является примитивным boolean
, а не типом обложки boolean
. Кто-нибудь есть предложение о том, как получить доступ к таким свойствам, как эти с помощью BeanUtils? Есть ли какое-то обходное решение, которое я могу использовать?
Ответы
Ответ 1
Наконец, я нашел юридическое подтверждение:
8.3.2 Логические свойства
Кроме того, для булевых свойств мы позволяем методу геттера соответствовать шаблону:
public boolean is<PropertyName>();
Из спецификации JavaBeans. Вы уверены, что не набрали JAXB-131 ошибка?
Ответ 2
Обходной путь для обработки логического isFooBar() с BeanUtils
- Создать новый BeanIntrospector
private static class BooleanIntrospector implements BeanIntrospector{
@Override
public void introspect(IntrospectionContext icontext) throws IntrospectionException {
for (Method m : icontext.getTargetClass().getMethods()) {
if (m.getName().startsWith("is") && Boolean.class.equals(m.getReturnType())) {
String propertyName = getPropertyName(m);
PropertyDescriptor pd = icontext.getPropertyDescriptor(propertyName);
if (pd == null)
icontext.addPropertyDescriptor(new PropertyDescriptor(propertyName, m, getWriteMethod(icontext.getTargetClass(), propertyName)));
else if (pd.getReadMethod() == null)
pd.setReadMethod(m);
}
}
}
private String getPropertyName(Method m){
return WordUtils.uncapitalize(m.getName().substring(2, m.getName().length()));
}
private Method getWriteMethod(Class<?> clazz, String propertyName){
try {
return clazz.getMethod("get" + WordUtils.capitalize(propertyName));
} catch (NoSuchMethodException e) {
return null;
}
}
}