我有传入消息,其中包含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应该的方式在框架中完成?
感谢您的帮助!
答案 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
支持。