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>