Hello Claus!
My first and easiest implementation of the bean-validator looks like (it is
inspired from the schema validation component):
public class BeanValidatorComponent extends DefaultComponent {
protected Endpoint createEndpoint(String uri, String remaining,
Map<String, Object> parameters) throws Exception {
BeanValidator beanValidator = new BeanValidator();
configureValidator(beanValidator, uri, remaining, parameters);
return new ProcessorEndpoint(uri, this, beanValidator);
}
protected void configureValidator(BeanValidator beanValidator, String
uri, String remaining, Map<String, Object> parameters) throws Exception {
ValidatorFactory factory =
Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
beanValidator.setValidator(validator);
}
}
public class BeanValidator implements Processor {
private Validator validator;
public void process(Exchange exchange) throws Exception {
Object bean = exchange.getIn().getBody();
Set<ConstraintViolation> constraintViolations =
validator.validate(bean);
handleErrors(exchange, constraintViolations);
}
public void handleErrors(Exchange exchange, Set<ConstraintViolation>
constraintViolations) throws ValidationException {
if (!constraintViolations.isEmpty()) {
throw new BeanValidationException(exchange,
constraintViolations, exchange.getIn().getBody());
}
}
public Validator getValidator() {
return validator;
}
public void setValidator(Validator validator) {
this.validator = validator;
}
}
public class BeanValidationException extends ValidationException {
private Set<ConstraintViolation> constraintViolations;
public BeanValidationException(Exchange exchange,
Set<ConstraintViolation> constraintViolations, Object bean) {
super(exchange, buildMessage(constraintViolations, bean));
this.constraintViolations = constraintViolations;
}
protected static String buildMessage(Set<ConstraintViolation>
constraintViolations, Object bean) {
StringBuffer buffer = new StringBuffer("Validation failed for: ");
buffer.append(bean);
buffer.append(" errors: [");
for (ConstraintViolation constraintViolation : constraintViolations)
{
buffer.append("property: " +
constraintViolation.getPropertyPath() + "; value: " +
constraintViolation.getInvalidValue() + "; constraint: " +
constraintViolation.getMessage() + "; ");
}
buffer.append("]");
return buffer.toString();
}
public Set<ConstraintViolation> getConstraintViolations() {
return constraintViolations;
}
}
I think this shows how the Validation API works. The Validator will not
throw any exception, if the validation fails. It returns a Set with
ConstraintViolations. Some features of the Validator API are not shown, but
interesting for the users:
- Validating groups
(http://docs.jboss.org/hibernate/stable/validator/reference/en/html_single/#validator-usingvalidator-validationgroups)
- Creating custom constraints
(http://docs.jboss.org/hibernate/stable/validator/reference/en/html_single/#validator-customconstraints)
- XML configuration
(http://docs.jboss.org/hibernate/stable/validator/reference/en/html_single/#validator-xmlconfiguration)
- Configure custom ValidationProviderResolver, MessageInterpolator,
TraversableResolver or ConstraintValidatorFactory
(http://docs.jboss.org/hibernate/stable/validator/reference/en/html_single/#validator-bootstrapping)
Because the validate method of the Validator doesn't throw an exception but
returns a Set with ConstraintViolations, I'm afraid we could not use the
bean component.
I found the following two still open issues for this topic:
http://issues.apache.org/activemq/browse/CAMEL-1276
http://issues.apache.org/activemq/browse/CAMEL-1537
You and others prefers to use Predicates/Processors like this:
from("foo")
.filter().validate(theValidationEndpointUri)
.to("blah")
or
from("foo")
.validate(nonblocking)
.to("bar")
Now, I think also this is the better solution to implements these
requirements. But I'm not so familiar with implementing
Predicates/Processors and extend the Java/XML DSL. Could you give me a hint,
where I could find a good sample in the Camel code to implement a
Predicate/Processor?
Regards,
Christian
--
View this message in context:
http://old.nabble.com/Proposal-for-a-new-camel-bean-validation-component-based-on-jsr-303-tp27950969p27975303.html
Sent from the Camel - Users mailing list archive at Nabble.com.