[ 
https://issues.apache.org/jira/browse/CAMEL-16507?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Pascal Schumacher updated CAMEL-16507:
--------------------------------------
    Description: 
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")
                    .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:java}
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).
  

 

  was:
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).
 

 


> 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
>            Priority: Major
>
> 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")
>                     .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:java}
> 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