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

Pascal Schumacher updated CAMEL-16507:
--------------------------------------
    Summary: Camel-sql: Body for empty ResultSet no longer null when using 
outputType selectOne  (was: Camel-sql: Empty String body for empty ResultSet 
when using outputType selectOne)

> Camel-sql: Body for empty ResultSet no longer null 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
>            Assignee: Claus Ibsen
>            Priority: Major
>             Fix For: 3.10.0
>
>
> 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