Pascal Schumacher created CAMEL-16507:
-----------------------------------------

             Summary: Camel-sql: Empty String body for empty ResultSet when 
using outputType selectOne
                 Key: CAMEL-16507
                 URL: https://issues.apache.org/jira/browse/CAMEL-16507
             Project: Camel
          Issue Type: Bug
          Components: camel-sql
    Affects Versions: 3.9.0
            Reporter: Pascal Schumacher


After upgrading from Camel 3.8.0 to 3.9.0 we noticed a change in behavior of 
camel-sql for empty ResultSets when using outputType selectOne.

In Camel 3.8.0 and older versions the out body was null, in Camel 3.9.0 the out 
body is an empty string. This causes simple statements accessing the body as a 
map to fail.

This test

{code:java}
public class CamelSqlEmptyResultTest extends CamelTestSupport {

    @Override
    protected RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
            public void configure() {
                from("seda:in")
                    .to("sql:select * from Persons where 
PersonID=1?outputType=selectOne")
                    .process(exchange -> {
                        Object body = exchange.getMessage().getBody();
                        System.err.println("Body: " + body);
                        if (body != null) {
                            System.err.println("Body class: " + 
body.getClass());
                        }
                    })
                    .setHeader("PersonID", simple("${body[PersonID]}"))
                    .to("mock:out");
            }
        };
    }

    @Override
    protected void bindToRegistry(Registry registry) throws Exception {
        EmbeddedDatabase db = new 
EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).generateUniqueName(true)
                .build();
        new JdbcTemplate(db).execute("CREATE TABLE Persons (PersonID int, 
LastName varchar(255))");
        registry.bind("dataSource", db);
    }

    @Test
    public void test() throws Exception {
        MockEndpoint out = getMockEndpoint("mock:out");
        out.expectedMessageCount(1);

        template.sendBody("seda:in", "");

        out.assertIsSatisfied(3_000);
    }
}
{code}

passes in Camel 3.8.0, but fails with:

{code}
org.apache.camel.language.bean.RuntimeBeanExpressionException: Failed to invoke 
method: [PersonID] on java.lang.String due to: 
java.lang.IndexOutOfBoundsException: Key: PersonID not found in bean:  of type: 
java.lang.String using OGNL path [[PersonID]]
       at 
org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:208)
       at 
org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:214)
       at 
org.apache.camel.language.simple.SimpleExpressionBuilder$28.evaluate(SimpleExpressionBuilder.java:757)
       at 
org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:35)
       at 
org.apache.camel.processor.SetHeaderProcessor.process(SetHeaderProcessor.java:48)
       at 
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:439)
       at 
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:181)
       at 
org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:62)
       at org.apache.camel.processor.Pipeline.process(Pipeline.java:167)
       at 
org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:388)
       at 
org.apache.camel.component.seda.SedaConsumer.sendToConsumers(SedaConsumer.java:269)
       at 
org.apache.camel.component.seda.SedaConsumer.doRun(SedaConsumer.java:187)
       at 
org.apache.camel.component.seda.SedaConsumer.run(SedaConsumer.java:130)
       at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
       at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
       at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IndexOutOfBoundsException: Key: PersonID not found in 
bean:  of type: java.lang.String using OGNL path [[PersonID]]
       at 
org.apache.camel.language.bean.BeanExpression.lookupResult(BeanExpression.java:540)
       at 
org.apache.camel.language.bean.BeanExpression.invokeOgnlMethod(BeanExpression.java:468)
       at 
org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:199)
{code}

in Camel 3.9.0.

I have uploaded a project to 
https://github.com/PascalSchumacher/CamelSqlEmptyResult which makes it easy to 
reproduce this issue (just by changing the camel version in the POM).
 

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to