2017-06-05 83 views
1

我有传入的消息有字符串有效负载,但数据库,(我不控制),将这些数据记录为BLOB。有没有办法让Spring Integration将一个字符串按到CLOB或BLOB中?有没有办法使用Spring Integration的jdbc编写BLOB:oubound-channel-adapter?

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

<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列中。

Ch。 18篇文档中有一个blob示例,整个事件被重写为服务激活器,而不是oubound-channel-adapter,以及从文件中流式传输......这看起来像是过度杀毒,但是BLOB和CLOBS应该是这样的方式在框架中完成?

感谢您的帮助!

回答

1

如何:

<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. 

UPDATE

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

貌似没有为SqlLobValue没有默认sqlType,所以我们应该做手工的东西在SqlParameterSource水平,因为正是一个提供getSqlType()合同。

我们可以简单地做到这一点与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; 
    } 
} 

随意提出一个JIRAsetSqlTypes()支持添加到ExpressionEvaluatingSqlParameterSourceFactory

+0

感谢您的回复!不幸的是,它似乎并没有工作 - 你会得到一个错误的IllegalArgumentException“SqlLobValue只支持SQL类型BLOB和CLOB”,它来源于SqlLobValue.setTypeValue(...)方法。 如果没有设置sqlType,即BLOB或CLOB,就会出现这种情况。向后追溯,我没有看到一种方法,如果没有准备好声明已将其注入到bean中... – Decker

+0

好!在我的答案中查看** UPDATE **。 –

+0

是的,修复它,谢谢阿尔乔姆,我欣赏它! – Decker

相关问题