This is a simple example to help those new to betwixt. It shows how a simple bean can be converted to xml and back again. A round trip, no less!
In order to run these simple examples, the classpath needs to contain Betwixt and all its dependencies . Note that any JAXP (1.1 or later) compliant parser can be used to replace xerces and xml-apis. JUnit is not required to run betwixt (but is needed if you want to run the unit tests in CVS).
This example is based around a very simple bean representing a person:
public class PersonBean {
private String name;
private int age;
/** Need to allow bean to be created via reflection */
public PersonBean() {}
public PersonBean(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "PersonBean[name='" + name + "',age='" + age + "']";
}
}
The basic usage pattern for writing beans using Betwixt is to create a BeanWriter, configure it
and then pass a bean into the write method. Pretty easy.
Here's a simple application which converts a person bean to xml which is then sent to System.out:
import java.io.StringWriter;
import org.apache.commons.betwixt.io.BeanWriter;
public class WriteExampleApp {
/**
* Create an example bean and then convert it to xml.
*/
public static final void main(String [] args) throws Exception {
// Start by preparing the writer
// We'll write to a string
StringWriter outputWriter = new StringWriter();
// Betwixt just writes out the bean as a fragment
// So if we want well-formed xml, we need to add the prolog
outputWriter.write("<?xml version='1.0' ?>");
// Create a BeanWriter which writes to our prepared stream
BeanWriter beanWriter = new BeanWriter(outputWriter);
// Configure betwixt
// For more details see java docs or later in the main documentation
beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
beanWriter.getBindingConfiguration().setMapIDs(false);
beanWriter.enablePrettyPrint();
// If the base element is not passed in, Betwixt will guess
// But let's write example bean as base element 'person'
beanWriter.write("person", new PersonBean("John Smith", 21));
// Write to System.out
// (We could have used the empty constructor for BeanWriter
// but this way is more instructive)
System.out.println(outputWriter.toString());
// Betwixt writes fragments not documents so does not automatically close
// writers or streams.
// This example will do no more writing so close the writer now.
outputWriter.close();
}
}
The basic usage pattern for reading beans is only a little more complex. This time, you need to create a BeanReader, configure it, register the bean classes that the xml will be mapped to and then parse should be called.
Here's a simple application that converts some xml to a person bean. The bean is then converted
to string and the result sent to System.out:
import java.io.StringReader;
import org.apache.commons.betwixt.io.BeanReader;
public class ReadExampleApp {
public static final void main(String args[]) throws Exception{
// First construct the xml which will be read in
// For this example, read in from a hard coded string
StringReader xmlReader = new StringReader(
"<?xml version='1.0' ?><person><age>25</age><name>James Smith</name></person>");
// Now convert this to a bean using betwixt
// Create BeanReader
BeanReader beanReader = new BeanReader();
// Configure the reader
// If you're round-tripping, make sure that the configurations are compatible!
beanReader.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
beanReader.getBindingConfiguration().setMapIDs(false);
// Register beans so that betwixt knows what the xml is to be converted to
// Since the element mapped to a PersonBean isn't called the same
// as Betwixt would have guessed, need to register the path as well
beanReader.registerBeanClass("person", PersonBean.class);
// Now we parse the xml
PersonBean person = (PersonBean) beanReader.parse(xmlReader);
// send bean to system out
System.out.println(person);
}
}
In the RSS example from Digester there's a bean which matches this pattern.
public class Channel
public Item[] getItems();
public void addItem(Item item);
}
This means that the following bean does not match this naming convention, since the plural property name does not start with the singular name.
public class Foo {
public Collection getPeople();
public void addPerson(Person person);
}
Though these two beans do match
public class Foo {
public Collection getPersonCollection();
public void addPerson(Person person);
}
public class Foo {
public Iterator getPersonIterator();
public void addPerson(Person person);
}
The following are other valid examples of composite-getter methods and their matching adder methods.
| Composite getter method | Adder method |
| getChildren() | addChild() |
| getPersonList() | addPerson() |
| getItems() | addItem() |
| getChannels() | addChannel() |
| getSheep() | addSheep() |