Hi,

I have a simple route as the following;

from("sql:select rowid vrow_id from myTable where nstatus = 0" +
MyBean.class.getName()
                                + "&onConsume=update myTable set nstatus = 1 
where VROW_ID =
:#${body.vrow_id}")
                                                .routeId("mySimpleRoute")
                                                
.threads(5).to("direct:generateLine")
                                                .end();

When i run such route, onConsume fails to update the row by giving the
stacktrace below;

(Please note that MyBean has the right attributes and setters and getters..)

org.apache.camel.language.bean.RuntimeBeanExpressionException: Failed to
invoke method: vrow_id on null due to:
org.apache.camel.component.bean.MethodNotFoundException: Method with name:
vrow_id not found on bean: MyBean[vrow_id=AAAGsJAAEAAApayAAE]
 of type: java.lang.String. Exchange[]
        at
org.apache.camel.language.bean.BeanExpression$OgnlInvokeProcessor.process(BeanExpression.java:321)
        at
org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:114)
        at
org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:138)
        at
org.apache.camel.model.language.ExpressionDefinition.evaluate(ExpressionDefinition.java:126)
        at
org.apache.camel.model.language.ExpressionDefinition.evaluate(ExpressionDefinition.java:118)
        at
org.apache.camel.builder.ExpressionBuilder$34.evaluate(ExpressionBuilder.java:852)
        at
org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:36)
        at
org.apache.camel.component.sql.DefaultSqlPrepareStatementStrategy.lookupParameter(DefaultSqlPrepareStatementStrategy.java:200)
        at
org.apache.camel.component.sql.DefaultSqlPrepareStatementStrategy$PopulateIterator.next(DefaultSqlPrepareStatementStrategy.java:267)
        at
org.apache.camel.component.sql.DefaultSqlPrepareStatementStrategy.populateStatement(DefaultSqlPrepareStatementStrategy.java:129)
        at
org.apache.camel.component.sql.DefaultSqlProcessingStrategy$1.doInPreparedStatement(DefaultSqlProcessingStrategy.java:52)
        at
org.apache.camel.component.sql.DefaultSqlProcessingStrategy$1.doInPreparedStatement(DefaultSqlProcessingStrategy.java:46)
        at
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:629)
        at
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:658)
        at
org.apache.camel.component.sql.DefaultSqlProcessingStrategy.commit(DefaultSqlProcessingStrategy.java:46)
        at
org.apache.camel.component.sql.SqlConsumer.processBatch(SqlConsumer.java:240)
        at
org.apache.camel.component.sql.SqlConsumer$1.doInPreparedStatement(SqlConsumer.java:137)
        at
org.apache.camel.component.sql.SqlConsumer$1.doInPreparedStatement(SqlConsumer.java:110)
        at
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:629)
        at
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:658)
        at
org.apache.camel.component.sql.SqlConsumer.poll(SqlConsumer.java:149)
        at
org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:175)
        at
org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:102)
        at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
        at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
        at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
Caused by: org.apache.camel.component.bean.MethodNotFoundException: Method
with name: vrow_id not found on bean: MyBean [vrow_id=AAAGsJAAEAAApayAAE]
 of type: java.lang.String. Exchange[]
        at
org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:271)
        at
org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:185)
        at
org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:159)
        at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109)
        at
org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:68)
        at
org.apache.camel.language.bean.BeanExpression$InvokeProcessor.process(BeanExpression.java:211)
        at
org.apache.camel.language.bean.BeanExpression$OgnlInvokeProcessor.process(BeanExpression.java:317)
        ... 29 more

I tracked down the issue and found out that 

in DefaultSqlPrepareStatementStrategy class the implementation on the
following method

    protected static Object lookupParameter(String nextParam, Exchange
exchange, Object body) {
        Map<?, ?> bodyMap =
safeMap(exchange.getContext().getTypeConverter().tryConvertTo(Map.class,
body));


can not do the right conversion from MyBean to Map.class.


Is there anyone facing a similar issue and being able to get around the
problem?

Cheers
Önder



--
View this message in context: 
http://camel.465427.n5.nabble.com/DefaultSqlPrepareStatementStrategy-lookupParameter-when-onConsume-used-in-SQL-component-tp5780437.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to