Java Beans, BeanUtils, and the Boolean wrapper class

Charles Hellstrom picture Charles Hellstrom · Mar 10, 2011 · Viewed 7.7k times · Source

I'm using BeanUtils to manipulate Java objects created via JAXB, and I've run into an interesting issue. Sometimes, JAXB will create a Java object like this:

public class Bean {
    protected Boolean happy;

    public Boolean isHappy() {
        return happy;
    }

    public void setHappy(Boolean happy) {
        this.happy = happy;
    }
}

The following code works just fine:

Bean bean = new Bean();
BeanUtils.setProperty(bean, "happy", true);

However, attempting to get the happy property like so:

Bean bean = new Bean();
BeanUtils.getProperty(bean, "happy");

Results in this exception:

Exception in thread "main" java.lang.NoSuchMethodException: Property 'happy' has no getter method in class 'class Bean'

Changing everything to a primitive boolean allows both the set and get call to work. I don't have this option, however, since these are generated classes. I assume this happens because the Java Bean libraries only consider an is<name> method to represent a property if the return type is a primitive boolean, and not the wrapper type Boolean. Does anyone have a suggestion as to how to access properties like these through BeanUtils? Is there some kind of workaround I can use?

Answer

Tomasz Nurkiewicz picture Tomasz Nurkiewicz · Mar 11, 2011

Finally I've found legal confirmation:

8.3.2 Boolean properties

In addition, for boolean properties, we allow a getter method to match the pattern:

public boolean is<PropertyName>();

From JavaBeans specification. Are you sure you haven't came across JAXB-131 bug?