CLOB和int-jdbc:stored-proc-outbound-gateway

时间:2015-04-08 14:49:26

标签: spring-integration clob

我尝试使用以下组件调用存储过程:

int-jdbc:stored-proc-outbound-gateway

它工作正常,它调用过程但我似乎无法以适当的CLOB格式记录CLOB。 我尝试过以下xml:

<int-jdbc:stored-proc-outbound-gateway
        id="auditGatewayProcedure" request-channel="auditGatewayInbound"
        data-source="dataSource" stored-procedure-name="PKG_TEMP.PR_AUDIT"
        return-value-required="false" ignore-column-meta-data="true">
        <int-jdbc:sql-parameter-definition
            name="IN_MSG_ID" />
        <int-jdbc:sql-parameter-definition
            name="IN_GUID" />
        <int-jdbc:sql-parameter-definition
            name="IN_CLOB" />
        <int-jdbc:parameter name="IN_MSG_ID" expression="payload.msgId" />
        <int-jdbc:parameter name="IN_CLOB" expression="payload.xmlPayload" />
        <int-jdbc:parameter name="IN_GUID" expression="payload.guid" />
</int-jdbc:stored-proc-outbound-gateway>

考虑到这一点,我传递了以下有效负载(使用正确的getter和setter):

private long id;
private String msgId;
private Clob xmlPayload;
private String guid;

CLOB的类型为:java.sql.Clob

我打电话的程序就是这么简单:

procedure PR_BRIDGE_AUDIT(in_msg_id IN varchar2,
                                 in_guid IN varchar2,
                                 in_clob IN Clob) is begin
    insert into tb_temp_all_messages(id,msg_id,xml_payload,guid) values (TB_TEMP_ALL_MESSAGES_SEQ.NEXTVAL,in_msg_id, in_clob, in_guid);

end;

使用以下值插入clob列:

org.hibernate.lob.SerializableClob@186fdd6

我做的第二次尝试是强制弹簧组件中的类型,如下所示:

<int-jdbc:sql-parameter-definition
            name="IN_CLOB" type="CLOB"/>

但抛出以下异常:java.lang.ClassCastException: org.hibernate.lob.SerializableClob cannot be cast to oracle.sql.CLOB

我做错了吗?

我试图谷歌它,但没有任何有价值的东西(据我所见)。

提前致谢!

更新

所以,经过一些尝试和Artem的回答,解决方案是两个,似乎:

给出这个XML:

<int-jdbc:stored-proc-outbound-gateway
        id="auditGatewayProcedure" request-channel="auditGatewayInbound"
        data-source="dataSource" stored-procedure-name="PKG_TGT_BRIDGE.PR_BRIDGE_AUDIT"
        return-value-required="false" ignore-column-meta-data="true">
        <int-jdbc:sql-parameter-definition
            name="IN_MSG_ID" />
        <int-jdbc:sql-parameter-definition
            name="IN_GUID" />
        <int-jdbc:sql-parameter-definition
            name="IN_CLOB" type="CLOB"/>
        <int-jdbc:parameter name="IN_MSG_ID" expression="payload.msgId" />
        <int-jdbc:parameter name="IN_CLOB" expression="payload.stringClob" />
        <int-jdbc:parameter name="IN_GUID" expression="payload.guid" />
</int-jdbc:stored-proc-outbound-gateway>

在EEM类中,您可以传递包含Clob(stringClob)的字符串。 或者使用Artem所说的内容创建一个正确的oracle.sql.CLOB类型,并将oracle.sql.CLOB创建的IN_CLOB参数传递给它。

希望这有帮助,

由于

1 个答案:

答案 0 :(得分:1)

您必须自己创建oracle.sql.CLOB并且在与<int-jdbc:stored-proc-outbound-gateway>相同的交易中创建的问题。

创建CLOB的代码可能如下所示:

public CLOB convertToClob(String value) {
    CLOB c = CLOB.createTemporary(getNativeConnection(), false, CLOB.DURATION_SESSION);
    c.setString(1L, value);
    return c;
}

private Connection getNativeConnection() {
    return DataSourceUtils.getConnection(this.dataSource).getMetaData().getConnection();
}