Bindy has been edited by Charles Moulliard (Feb 05, 2009).

(View changes)

Content:

Bindy

Available as of Camel 2.0

The idea that the developers have followed to design this component was to allow the binding of non structured data (or to be more precise non-XML data)
to Java Bean using annotations. Using Bindy, you can bind data like :

  • CSV record,
  • Fixedlength record,
  • or any other non-structured data

to one or many POJOS and to convert the data according to the type of the java property. POJOS can be linked together. Moreover, for data type like Date, Double, Float,
Integer, Short, Long and BigDecimal, you can provide the pattern to apply during the formatting of the property.

For the BigDecimal number, you can also define the precision and the decimal or grouping separators

Type Format Type Pattern example Link
Date DateFormat "dd-MM-yyyy" http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html
Decimal* Decimalformat "##.###.###" http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html

Decimal* = Double, Integer, Float, Short, Long

Be careful
This first release only support CSV record.

To work with camel-bindy, you must first define your model in a package (e.g. com.acme.model) and for each model class (e.g. Order, Client, Instrument, ...) associate
the required annotations (described hereafter) with Class or property name.

Annotation name Level Parameter
Name Type Info
CsvRecord Class separator string mandatory - can be ',' or ';' or 'anything'
skipFirstLine boolean optional - default value = false
This annotation is associated to the root class of the model and must be declared one time.

e.g : If the record represents orders, then this annotation is added to the Order class like this :

@CsvRecord( separator = "," )
public Class Order

or

@CsvRecord( separator = ";" )
public Class Order

 
Link Class, Property linkType LinkType optional - by default the value is LinkType.oneToOne
Only one-to-one relation is allowed.

e.g : If the model Class Client is linked to the Order class, then use annotation Link in the Order class like this:

@Link
private Client client

 
DataField Property int pos mandatory - digit number
pattern string optional - default value = "" - will be used to format Decimal, Date, ...
length int optional - digit number - represents the length of the field for fixed length format
precision int optional - digit number - represents the precision to be used when the Decimal number will be formatted/parsed

case 1 : position

@DataField(pos = 0)
private int orderNr;

@DataField(pos = 1)
private String ref;

case 2 : pattern

@DataField(pos = 8, pattern = "dd-MM-yyyy")
private Date orderDate;

case 3 : precision

@DataField(pos = 6, precision = 2)
private BigDecimal amount;

 

Using the Java DSL

The next step consists in creating a DataFormat bindy class and providing Java package names as parameter to instantiate the class.

For example the following uses a named DataFormat which is configured with "com.acme.model" package name to initialize the model objects configurated in this package.

DataFormat bindy = new CsvBindyDataFormat("com.acme.model");

from("file://inbox").
  unmarshal(bindy).
  to("bean:handleOrder");

You can if you prefer use a named reference to a data format which can then be defined in your Registry such as via your Spring XML file. e.g.

from("file://inbox").
  unmarshal("myBindyDataFormat").
  to("bean:handleOrder");

Using Spring XML

TODO:

Dependencies

To use Bindy in your camel routes you need to add the a dependency on camel-bindy which implements this data format.

If you use maven you could just add the following to your pom.xml, substituting the version number for the latest & greatest release (see the download page for the latest versions).

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-bindy</artifactId>
  <version>2.0.0</version>
</dependency>

Reply via email to