Type Converter
Its very common when routing messages from one endpoint to another to need to convert the body payloads from one type to another such as to convert to and from the following common types
- File
- String
- byte[] and yteBuffer
- InputStream and OutputStream
- Reader and Writer
- Document and Source
The Message interface defines a helper method to allow conversions to be done via the getBody(Class) method.
So in an endpoint you can convert a body to another type via
Message message = exchange.getIn(); Document document = message.getBody(Document.class);
How Type Conversion works
The type conversion strategy is defined by the TypeConverter interface which can be customized on a CamelContext.
The default implementation, DefaultTypeConverter uses pluggable strategies to load type converters via TypeConverterLoader. The default strategy, AnnotationTypeConverterLoader uses a discovery mechanism to find converters.
Discovering Type Converters
The AnnotationTypeConverterLoader will search the classpath for a file called META-INF/services/org/apache/camel/TypeConverter. The contents are expected to be comma separated package names. These packages are then recursively searched for any objects with the @Converter annotation. Then any method marked with @Converter is assumed to be a conversion method; where the parameter is the from value and the return is the to value.
e.g. the following shows how to register a converter from File -> InputStream
@Converter public class IOConverter { @Converter public static InputStream toInputStream(File file) throws FileNotFoundException { return new BufferedInputStream(new FileInputStream(file)); } }
We have most of the common converters for common Java types in the org.apache.camel.converter package and its children.