EhCache config with BeanUtils

BeanUtils allows you to set Bean properties.If you have configuration stored in a Map it’s tempting to use BeanUtils to automagically setup EhCache configuration.Sadly this class has mixed types in setters and getter and thus BeanUtils that use Introsp…

BeanUtils allows you to set Bean properties.
If you have configuration stored in a Map it’s tempting to use BeanUtils to automagically setup EhCache configuration.
Sadly this class has mixed types in setters and getter and thus BeanUtils that use Introspector behind won’t get getter and setter pairs properly. It will get only getters and thus inform you that these properties are read only: “Skipping read-only property”.

My fast solution is to use BeanUtils and have a fallback to Reflection.

public static void setProperty(Object obj, String propertyName, Object propertyValue, boolean silently) {
try {
PropertyDescriptor desc = PropertyUtils.getPropertyDescriptor(obj, propertyName);
Method writeMethod = desc.getWriteMethod();

if (writeMethod == null) {
writeMethod = getAlternativeWriteMethod(obj, propertyName, propertyValue.getClass());
}

if (writeMethod == null) {
if (silently) {
return;
}
throw new IllegalArgumentException("Can't find writerMethod for " + propertyName);
}

if (LOG.isTraceEnabled()) {
LOG.trace(String.format("Setting %s property of %s", propertyName, obj.getClass().getSimpleName()));
}

writeMethod.invoke(obj, propertyValue);
} catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
throw new IllegalArgumentException("Error when setting object property.", e);
}
}

private static Method getAlternativeWriteMethod(Object obj, String propertyName, Class paramClass) throws NoSuchMethodException {
String setterMethod = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
Method m;
if ((m = getMethod(obj, paramClass, setterMethod)) != null) {
return m;
}
Class altClass = paramClass.isPrimitive() ? ClassUtils.primitiveToWrapper(paramClass) : ClassUtils.wrapperToPrimitive(paramClass);
if ((m = getMethod(obj, altClass, setterMethod)) != null) {
return m;
}

return null;
}

private static Method getMethod(Object obj, Class paramClass, String setterMethod) {

try {
return obj.getClass().getMethod(setterMethod, paramClass);
} catch (NoSuchMethodException e) {
return null;
}
}

I will think about PR to Configuration class but it’s complicated as EhCache 2.x is not present on GitHub.

You May Also Like

Using Eclipse snippets for faster JUnit test creation (with Mockito!)

I'm using this snippet to create a template of new unit test method supporting BDD mockito tests. This is a good example for adding static imports to a class from snippets.@${testType:newType(org.junit.Test)}public void should${testname}() { ${staticIm...I'm using this snippet to create a template of new unit test method supporting BDD mockito tests. This is a good example for adding static imports to a class from snippets.@${testType:newType(org.junit.Test)}public void should${testname}() { ${staticIm...

Simple HBase ORM

When dealing with data stored in HBase, you are quick to come to a conclusion, that it is extremaly inconvenient to reach to it via HBase native API. It is very verbose and you always need to convert between bytes and simple types - a pain. While I wa...When dealing with data stored in HBase, you are quick to come to a conclusion, that it is extremaly inconvenient to reach to it via HBase native API. It is very verbose and you always need to convert between bytes and simple types - a pain. While I wa...