CAMEL-7432: camel-mybatis should keep message body as-is if calling stored procedure and it did not return data, but are using OUT parameters etc.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/53c75549 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/53c75549 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/53c75549 Branch: refs/heads/camel-2.12.x Commit: 53c75549f55d515133b697fa33980b6228fd44bb Parents: 1f861c6 Author: Claus Ibsen <[email protected]> Authored: Thu Jun 26 21:56:40 2014 +0200 Committer: Claus Ibsen <[email protected]> Committed: Thu Jun 26 22:12:48 2014 +0200 ---------------------------------------------------------------------- .../component/mybatis/MyBatisProducer.java | 50 +++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/53c75549/components/camel-mybatis/src/main/java/org/apache/camel/component/mybatis/MyBatisProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-mybatis/src/main/java/org/apache/camel/component/mybatis/MyBatisProducer.java b/components/camel-mybatis/src/main/java/org/apache/camel/component/mybatis/MyBatisProducer.java index 03367e3..6465636 100644 --- a/components/camel-mybatis/src/main/java/org/apache/camel/component/mybatis/MyBatisProducer.java +++ b/components/camel-mybatis/src/main/java/org/apache/camel/component/mybatis/MyBatisProducer.java @@ -23,6 +23,7 @@ import org.apache.camel.Message; import org.apache.camel.impl.DefaultProducer; import org.apache.camel.util.ExchangeHelper; import org.apache.camel.util.ObjectHelper; +import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.slf4j.Logger; @@ -105,7 +106,7 @@ public class MyBatisProducer extends DefaultProducer { result = session.selectOne(statement); } - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } private void doSelectList(Exchange exchange, SqlSession session) throws Exception { @@ -119,7 +120,7 @@ public class MyBatisProducer extends DefaultProducer { result = session.selectList(statement); } - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } private void doInsert(Exchange exchange, SqlSession session) throws Exception { @@ -132,12 +133,12 @@ public class MyBatisProducer extends DefaultProducer { Object value = iter.next(); LOG.trace("Inserting: {} using statement: {}", value, statement); result = session.insert(statement, value); - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } } else { LOG.trace("Inserting using statement: {}", statement); result = session.insert(statement); - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } } @@ -148,11 +149,11 @@ public class MyBatisProducer extends DefaultProducer { // just pass in the body as Object and allow MyBatis to iterate using its own foreach statement LOG.trace("Inserting: {} using statement: {}", in, statement); result = session.insert(statement, in); - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } else { LOG.trace("Inserting using statement: {}", statement); result = session.insert(statement); - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } } @@ -166,12 +167,12 @@ public class MyBatisProducer extends DefaultProducer { Object value = iter.next(); LOG.trace("Updating: {} using statement: {}", value, statement); result = session.update(statement, value); - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } } else { LOG.trace("Updating using statement: {}", statement); result = session.update(statement); - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } } @@ -182,11 +183,11 @@ public class MyBatisProducer extends DefaultProducer { // just pass in the body as Object and allow MyBatis to iterate using its own foreach statement LOG.trace("Updating: {} using statement: {}", in, statement); result = session.update(statement, in); - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } else { LOG.trace("Updating using statement: {}", statement); result = session.update(statement); - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } } @@ -200,12 +201,12 @@ public class MyBatisProducer extends DefaultProducer { Object value = iter.next(); LOG.trace("Deleting: {} using statement: {}", value, statement); result = session.delete(statement, value); - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } } else { LOG.trace("Deleting using statement: {}", statement); result = session.delete(statement); - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } } @@ -216,15 +217,15 @@ public class MyBatisProducer extends DefaultProducer { // just pass in the body as Object and allow MyBatis to iterate using its own foreach statement LOG.trace("Deleting: {} using statement: {}", in, statement); result = session.delete(statement, in); - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } else { LOG.trace("Deleting using statement: {}", statement); result = session.delete(statement); - doProcessResult(exchange, result); + doProcessResult(exchange, result, session); } } - private void doProcessResult(Exchange exchange, Object result) { + private void doProcessResult(Exchange exchange, Object result, SqlSession session) { if (endpoint.getStatementType() == StatementType.SelectList || endpoint.getStatementType() == StatementType.SelectOne) { Message answer = exchange.getIn(); if (ExchangeHelper.isOutCapable(exchange)) { @@ -232,8 +233,23 @@ public class MyBatisProducer extends DefaultProducer { // preserve headers answer.getHeaders().putAll(exchange.getIn().getHeaders()); } - // set the result as body for insert - answer.setBody(result); + + // we should not set the body if its a stored procedure as the result is already in its OUT parameter + MappedStatement ms = session.getConfiguration().getMappedStatement(statement); + if (ms != null && ms.getStatementType() == org.apache.ibatis.mapping.StatementType.CALLABLE) { + if (result == null) { + LOG.trace("Setting result as existing body as MyBatis statement type is Callable, and there was no result."); + answer.setBody(exchange.getIn().getBody()); + } else { + // set the result as body for insert + LOG.trace("Setting result as body: {}", result); + answer.setBody(result); + } + } else { + // set the result as body for insert + LOG.trace("Setting result as body: {}", result); + answer.setBody(result); + } answer.setHeader(MyBatisConstants.MYBATIS_RESULT, result); answer.setHeader(MyBatisConstants.MYBATIS_STATEMENT_NAME, statement);
