You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Integration DSL:存储过程出站网关输入参数传递实现

如何在Spring Integration DSL中配置存储过程出站网关的输入参数

咱们先理清楚需求:你要把原来的XML存储过程出站网关配置转成DSL形式,目前已经写了基础的StoredProcOutboundGateway和StoredProcExecutor Bean,现在需要补充输入参数的传递配置,对应原XML里的<int-jdbc:sql-parameter-definition>和<int-jdbc:parameter>部分。

核心思路

存储过程的参数定义与映射逻辑是在StoredProcExecutor中配置的,而非直接在网关对象上。咱们需要完成这几件事:

  1. 定义存储过程的参数(包含IN/OUT方向),对应XML里的参数定义标签;
  2. 设置输入参数的表达式映射,把消息payload里的字段绑定到存储过程的IN参数上;
  3. 同步原XML里的其他配置(比如ignore-column-meta-data)。

完整的DSL配置代码

我把你的代码补充完整,注释里会对应原XML的配置项:

@Bean
public StoredProcOutboundGateway spGateway(){
    StoredProcOutboundGateway storedProcOutboundGateway = new StoredProcOutboundGateway(storedProcExecutor());
    // 对应XML里的expect-single-result="false",注意你原DSL写了true,这里要修正
    storedProcOutboundGateway.setExpectSingleResult(false);
    storedProcOutboundGateway.setRequiresReply(true);
    // 对应XML里的request-channel="myChannel"
    storedProcOutboundGateway.setRequestChannelName("myChannel");
    return storedProcOutboundGateway;
}

@Bean
public StoredProcExecutor storedProcExecutor() {
    StoredProcExecutor storedProcExecutor = new StoredProcExecutor(this.datasource);
    // 对应XML里的stored-procedure-name="SAMPLE_SP",注意你原DSL写了SAMPLE_SP2,这里要修正
    storedProcExecutor.setStoredProcedureName("SAMPLE_SP");
    storedProcExecutor.setIsFunction(false);
    // 对应XML里的ignore-column-meta-data="true"
    storedProcExecutor.setIgnoreColumnMetaData(true);

    // 1. 定义存储过程的参数(对应XML里的<int-jdbc:sql-parameter-definition>)
    List<SqlParameterDefinition> paramDefinitions = new ArrayList<>();
    // 配置IN参数V_TEST_ID
    SqlParameterDefinition testIdInParam = new SqlParameterDefinition();
    testIdInParam.setName("V_TEST_ID");
    testIdInParam.setDirection(ParameterDirection.IN);
    paramDefinitions.add(testIdInParam);
    // 配置OUT参数O_MSG
    SqlParameterDefinition msgOutParam = new SqlParameterDefinition();
    msgOutParam.setName("O_MSG");
    msgOutParam.setDirection(ParameterDirection.OUT);
    paramDefinitions.add(msgOutParam);

    storedProcExecutor.setSqlParameterDefinitions(paramDefinitions);

    // 2. 设置输入参数的映射规则(对应XML里的<int-jdbc:parameter name="V_TEST_ID" expression="payload.testId"/>)
    ExpressionEvaluatingParameterSourceFactory paramSourceFactory = new ExpressionEvaluatingParameterSourceFactory();
    Map<String, Expression> paramExpressions = new HashMap<>();
    // 把消息payload里的testId字段映射到存储过程的V_TEST_ID参数
    paramExpressions.put("V_TEST_ID", new SpelExpressionParser().parseExpression("payload.testId"));
    paramSourceFactory.setParameterExpressions(paramExpressions);

    storedProcExecutor.setParameterSourceFactory(paramSourceFactory);

    // 如果需要处理OUT参数O_MSG,可以添加返回值映射(比如用SingleColumnRowMapper处理简单类型)
    Map<String, RowMapper<?>> returnValueMappers = new HashMap<>();
    returnValueMappers.put("O_MSG", new SingleColumnRowMapper<>(String.class));
    storedProcExecutor.setReturnValueMappers(returnValueMappers);

    return storedProcExecutor;
}

关键配置说明

  • 参数定义:用SqlParameterDefinition类模拟XML里的<int-jdbc:sql-parameter-definition>,明确每个参数的名称和方向(IN/OUT);
  • 参数映射:ExpressionEvaluatingParameterSourceFactory是核心,它允许咱们用SpEL表达式把消息的payload(或header)绑定到存储过程的输入参数上,和XML里的expression属性功能完全一致;
  • 同步原有配置:别忘了把XML里的ignore-column-meta-data="true"转换成setIgnoreColumnMetaData(true),还有存储过程名称、expect-single-result这些属性都要和原XML保持一致,避免行为差异。

内容的提问来源于stack exchange,提问作者Saravanan Ramamoorthy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:45:40