# Camel Example Validator Spring Boot

This example shows how to work with a simple Apache Camel application using Spring Boot with declarative content validation enabled.

The example generates messages using timer trigger, writes them to standard output. The output type is declared as `greeting`, which has corresponding validator defined.

## Camel routes

The Camel route is located in the `SampleCamelRouter` class. In this class the route
starts from a timer, that triggers every 2nd second and calls a Spring Bean `SampleBean`
which returns a message, that is routed to a stream endpoint which writes to standard output.
The output type is declared as `greeting`, and the validator `GreetingValidator` is registered
to be triggered for `greeting` output message right after the routing. 

## Using Camel components

Apache Camel provides 200+ components which you can use to integrate and route messages between many systems
and data formats. To use any of these Camel components, add the component as a dependency to your project.

## How to run

You can run this example using

    mvn spring-boot:run

## More information

You can find more information about Apache Camel at the website: http://camel.apache.org/
