17

我正在使用 BeanUtils 来操作通过 JAXB 创建的 Java 对象,并且遇到了一个有趣的问题。有时,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允许 set 和 get 调用工作。但是,我没有这个选项,因为这些是生成的类。我假设发生这种情况是因为 Java Bean 库仅is<name>在返回类型是原始类型boolean而不是包装类型时才考虑表示属性的方法Boolean。有没有人建议如何通过 BeanUtils 访问这些属性?我可以使用某种解决方法吗?

4

3 回答 3

10

最后我找到了法律确认:

8.3.2 布尔属性

此外,对于布尔属性,我们允许使用 getter 方法来匹配模式:

public boolean is<PropertyName>();

来自JavaBeans 规范。你确定你没有遇到过JAXB-131错误吗?

于 2011-03-11T17:21:26.183 回答
8

使用 BeanUtils 处理 Boolean isFooBar() 情况的解决方法

  1. 创建新的 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;
        }
    }
}

  1. 注册 BooleanIntrospector:

    BeanUtilsBean.getInstance().getPropertyUtils().addBeanIntrospector(new BooleanIntrospector());

于 2014-04-24T22:35:43.623 回答
0

您可以使用 SET 创建第二个 getter - 后缀作为解决方法:)

于 2018-06-04T21:03:19.670 回答