[ https://issues.apache.org/jira/browse/CAMEL-12565?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claus Ibsen resolved CAMEL-12565. --------------------------------- Resolution: Fixed Fix Version/s: 2.22.1 2.21.3 Thanks for the unit test its been added to the source code and also a input validation variation. > outputTypeWithValidate (or inputTypeWithValidate) + validator()... doesn't > work as expected > ------------------------------------------------------------------------------------------- > > Key: CAMEL-12565 > URL: https://issues.apache.org/jira/browse/CAMEL-12565 > Project: Camel > Issue Type: Bug > Components: camel-core > Affects Versions: 2.21.1 > Environment: Tested on camel 2.21.1, Java 8, Win > Reporter: Michael Dzuba > Assignee: Claus Ibsen > Priority: Major > Fix For: 2.21.3, 2.22.1, 2.23.0 > > > {code:java} > package org.mike.tests; > import org.apache.camel.ValidationException; > import org.apache.camel.builder.RouteBuilder; > import org.apache.camel.test.junit4.CamelTestSupport; > import org.junit.Test; > public class ValidatorTests extends CamelTestSupport { > @Override > protected RouteBuilder createRouteBuilder() throws Exception { > return new RouteBuilder() { > @Override > public void configure() throws Exception { > validator() > .type(String.class) > > .withExpression(bodyAs(String.class).isEqualToIgnoreCase("valid")); > onException(ValidationException.class) > .handled(true) > .log("Invalid predicate: ${exception.message}") > .to("mock:invalid"); > from("direct:in") > > //.validate(bodyAs(String.class).isEqualToIgnoreCase("valid")) > .outputTypeWithValidate(String.class) // or > .inputTypeWithValidate(String.class) > .to("mock:out"); > } > }; > } > @Test > public void testValid() throws InterruptedException { > getMockEndpoint("mock:out").expectedMessageCount(1); > getMockEndpoint("mock:invalid").expectedMessageCount(0); > template.sendBody("direct:in", "valid"); > assertMockEndpointsSatisfied(); > } > @Test > public void testInvalid() throws InterruptedException { > getMockEndpoint("mock:out").expectedMessageCount(0); > getMockEndpoint("mock:invalid").expectedMessageCount(1); > template.sendBody("direct:in", "wrong"); > assertMockEndpointsSatisfied(); > } > } > {code} > Expected result: both tests pass > Actual result: 'testValid' - passed, 'testInvalid' - failed > If uncomment line 25 & comment 26 > {code:java} > .validate(bodyAs(String.class).isEqualToIgnoreCase("valid")) > //.inputTypeWithValidate(String.class) > {code} > tests will OK > > Other test case with same results > > {code:java} > package org.mike.tests; > import org.apache.camel.Message; > import org.apache.camel.ValidationException; > import org.apache.camel.builder.RouteBuilder; > import org.apache.camel.impl.JndiRegistry; > import org.apache.camel.spi.DataType; > import org.apache.camel.spi.Validator; > import org.apache.camel.test.junit4.CamelTestSupport; > import org.junit.Test; > import org.slf4j.Logger; > import org.slf4j.LoggerFactory; > public class BeanValidatorTest extends CamelTestSupport { > @Override > protected RouteBuilder createRouteBuilder() throws Exception { > return new RouteBuilder() { > @Override > public void configure() throws Exception { > validator() > .type("toValidate") > .withBean("testValidator"); > onException(ValidationException.class) > .handled(true) > .log("Invalid validation: ${exception.message}") > .to("mock:invalid"); > from("direct:in") > .outputTypeWithValidate("toValidate") > .to("mock:out"); > } > }; > } > public static class TestValidator extends Validator { > private static final Logger LOG = > LoggerFactory.getLogger(TestValidator.class); > @Override > public void validate(Message message, DataType type) throws > ValidationException { > Object body = message.getBody(); > LOG.info("Validating : [{}]", body); > if (body instanceof String && body.equals("valid")) { > LOG.info("OK"); > } else { > throw new ValidationException(message.getExchange(), "Wrong > content"); > } > } > } > @Override > protected JndiRegistry createRegistry() throws Exception { > JndiRegistry registry = super.createRegistry(); > registry.bind("testValidator", new TestValidator()); > return registry; > } > @Test > public void testValid() throws InterruptedException { > getMockEndpoint("mock:out").expectedMessageCount(1); > getMockEndpoint("mock:invalid").expectedMessageCount(0); > template.sendBody("direct:in", "valid"); > assertMockEndpointsSatisfied(); > } > @Test > public void testInvalid() throws InterruptedException { > getMockEndpoint("mock:out").expectedMessageCount(0); > getMockEndpoint("mock:invalid").expectedMessageCount(1); > template.sendBody("direct:in", "wrong"); > assertMockEndpointsSatisfied(); > } > } > {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005)