有没有办法使用Spring Integration的jdbc:oubound-channel-adapter编写BLOB?

时间:2017-06-05 17:08:32

标签: spring oracle spring-integration

我有传入消息,其中包含String有效负载,但数据库(我无法控制)将此数据记录为BLOB。有没有办法让Spring Integration将String按入CLOB或BLOB?

我有一个出站通道适配器执行数据库插入,(简化)看起来像:

<int-jdbc:outbound-channel-adapter channel="inboundTraffic"
                                   datasource="localDataSource"
                                   query="insert into MESSAGES (DATA, SAVE_DATE)
                                          values (:payload, :saveDate)"
                                   sql-parameter-source-factory="spelSource" />

<bean id="spelSource" class="o.s.i.j.ExpressionEvaluatingSqlParameterSourceFactory">
    <property name="parameterExpressions">
         <map>
              <entry key="payload" value="payload" />
              <entry key="saveDate" value="new java.util.Date()" />
         </map>
    </property>
</bean>

但是我在有效载荷上得到了SQLException:

  

ORA-01461只能将LONG值绑定到LONG列中。

章。 18个文档有一个blob示例,整个事情被重写为服务激活器,而不是一个oubound-channel-adapter,并从一个文件中流式传输......这看起来有点过分,但这就是BLOB和CLOBS应该的方式在框架中完成?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

这个怎么样:

<entry key="payload" value="new org.springframework.jdbc.core.support.SqlLobValue(payload)" />

请参阅其JavaDoc:

 * Object to represent an SQL BLOB/CLOB value parameter. BLOBs can either be an
 * InputStream or a byte array. CLOBs can be in the form of a Reader, InputStream
 * or String. Each CLOB/BLOB value will be stored together with its length.
 * The type is based on which constructor is used. Objects of this class are
 * immutable except for the LobCreator reference. Use them and discard them.

<强>更新

  

“SqlLobValue仅支持SQL类型BLOB和CLOB”,它源自SqlLobValue.setTypeValue(...)方法。

sqlType看起来没有默认SqlLobValue,因此我们应该在SqlParameterSource级别上手动执行某些操作,因为正好提供getSqlType()合同。< / p>

我们只需使用ExpressionEvaluatingSqlParameterSourceFactory扩展程序

即可
public class MyExpressionEvaluatingSqlParameterSourceFactory extends ExpressionEvaluatingSqlParameterSourceFactory {
    @Override
    public SqlParameterSource createParameterSource(Object input) {
        AbstractSqlParameterSource parameterSource =
                (AbstractSqlParameterSource) super.createParameterSource(input);
        parameterSource.registerSqlType("payload", Types.BLOB);
        return parameterSource;
    }
}

随意提出JIRA以向setSqlTypes()添加ExpressionEvaluatingSqlParameterSourceFactory支持。