[英]Java Beans, BeanUtils, and the Boolean wrapper class
我正在使用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访问这些属性? 我可以使用某种解决方法吗?
最后我找到了法律确认:
8.3.2布尔属性
另外,对于布尔属性,我们允许getter方法匹配模式:
public boolean is<PropertyName>();
来自JavaBeans规范 。 你确定你没有遇到过JAXB-131错误吗?
使用BeanUtils处理布尔isFooBar()的解决方法
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;
}
}
}
注册BooleanIntrospector:
BeanUtilsBean.getInstance()。getPropertyUtils()。addBeanIntrospector(new BooleanIntrospector());
你可以创建第二个getter与SET - sufix作为解决方法:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.