To render Java 5 Enums as primitive strings, two steps are needed. First, Betwixt needs to be told that the Enum class should be treated as a primitive and not a Bean, otherwise the Enum will be introspected and the property accessor getDeclaringClass will be found. The result is this:
<myEnumType>
<declaringClass>my.package.MyEnumType</declaringClass>
</myEnumType>To make Betwixt treat Java 5 Enums as primitive types, implement a TypeBindingStrategy:
import org.apache.commons.betwixt.strategy.*;
/**
* @author Jesse Sweetland
*/
public class EnumTypeBindingStrategy extends TypeBindingStrategy {
public TypeBindingStrategy.BindingType bindingType(Class type) {
TypeBindingStrategy.BindingType bindingType = null;
if(Enum.class.isAssignableFrom(type)) {
bindingType = TypeBindingStrategy.BindingType.PRIMITIVE;
} else {
bindingType = TypeBindingStrategy.DEFAULT.bindingType(type);
}
return bindingType;
}
}Once the TypeBindingStrategy class has been created, configure the Betwixt BeanWriter to use it:
StringWriter sw = new StringWriter(); BeanWriter bw = new BeanWriter(sw); bw.getXMLIntrospector().getConfiguration().setTypeBindingStrategy(new EnumTypeBindingStrategy());
Next, we need to tell Betwixt how to convert back and forth between String and Enum values. To do this, implement an ObjectStringConverter:
import org.apache.commons.betwixt.expression.*;
import org.apache.commons.betwixt.strategy.*;
/**
* @author Jesse Sweetland
*/
public class EnumObjectStringConverter extends DefaultObjectStringConverter {
public String objectToString(Object object, Class type, Context context) {
String value = null;
if(object instanceof Enum) {
value = ((Enum)object).name();
} else {
value = super.objectToString(object, type, context);
}
return value;
}
public Object stringToObject(String value, Class type, Context context) {
Object object = null;
if(Enum.class.isAssignableFrom(type)) {
object = Enum.valueOf(type, value);
} else {
object = super.stringToObject(value, type, context);
}
return object;
}
}Now, configure the converter on the BeanWriter:
StringWriter sw = new StringWriter(); BeanWriter bw = new BeanWriter(sw); bw.getXMLIntrospector().getConfiguration().setTypeBindingStrategy(new EnumTypeBindingStrategy()); bw.getBindingConfiguration().setObjectStringConverter(new EnumObjectStringConverter());
Now the above enumeration should render like this:
<myEnumType>SOME_CONSTANT</myEnumType>