0

让我们想象一下我想将一个列表传递给一个 JDBC 转换器。

例如,我在流程中创建列表:

<scripting:transformer><scripting:script engine="groovy"><scripting:text>
    // Some calculations and stuff

    def single_quote_alias = "'"
    def listString = seasonMbIds.join("',' ")           
    return single_quote_alias + listString + single_quote_alias // now it's like:  '11','22','33' 
</scripting:text></scripting:script></scripting:transformer>

然后将列表传递给另一个转换器:

<jdbc:outbound-endpoint connector-ref="XYZ" queryKey="someName" exchange-pattern="request-response" />

这是实际的查询:

<jdbc:query key="someName" 
                value="SELECT anID FROM aTable WHERE aField IN (#[payload:])" />

它给了我“超出范围的索引异常”:

Message               : java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 (javax.script.ScriptException)
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. Index: 0, Size: 0 (java.lang.IndexOutOfBoundsException)
  java.util.ArrayList:635 (null)
2. java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 (javax.script.ScriptException)

可能有一些逃避问题。我使用了不同的分隔符,问题仍然存在......

有什么建议吗?

4

1 回答 1

1

由于查询格式化选项有限,将 Mule 用于更高级的 JDBC 内容可能非常非常痛苦。我知道您有两个选择:1)编写一个使用您的 jdbc 连接器执行查询的脚本,或者 2)为您的 jdbc 连接器定义一个自定义查询策略。这是一个简单的技巧,您可以使用它使单个查询与选项 2 一起使用(尽管会破坏所有其他选择查询......):

包括您的自定义 Java 类:

<jdbc:connector name="Database" dataSource-ref="MySQL_Data_Source" validateConnections="true" queryTimeout="-1" pollingFrequency="0" doc:name="Database">
    <jdbc:sqlStatementStrategyFactory class="org.mule.transport.jdbc.sqlstrategy.MySqlStatementStrategyFactory"/>
</jdbc:connector>

编写您的自定义工厂 Java 类:

package org.mule.transport.jdbc.sqlstrategy;

public class MySqlStatementStrategyFactory extends DefaultSqlStatementStrategyFactory {

  public MySqlStatementStrategyFactory()
  {
    super();
    selectSQLStrategy = new MySelectSqlStatementStrategy();
  }

}

创建您的策略类并从此处复制默认选择策略的源代码

替换复制的源代码中的类定义:

public  class MySelectSqlStatementStrategy extends SelectSqlStatementStrategy

找到创建查询结果的两行并替换为您自己的实现,例如:

result = connector.getQueryRunnerFor(endpoint).query(connection, readStmt.replace("?", (String)params[0]),
      connector.getResultSetHandler());
于 2014-02-28T11:44:34.793 回答