Spring Integration DSL:存储过程出站网关输入参数传递实现
如何在Spring Integration DSL中配置存储过程出站网关的输入参数
咱们先理清楚需求:你要把原来的XML存储过程出站网关配置转成DSL形式,目前已经写了基础的StoredProcOutboundGateway和StoredProcExecutor Bean,现在需要补充输入参数的传递配置,对应原XML里的<int-jdbc:sql-parameter-definition>和<int-jdbc:parameter>部分。
核心思路
存储过程的参数定义与映射逻辑是在StoredProcExecutor中配置的,而非直接在网关对象上。咱们需要完成这几件事:
- 定义存储过程的参数(包含IN/OUT方向),对应XML里的参数定义标签;
- 设置输入参数的表达式映射,把消息payload里的字段绑定到存储过程的IN参数上;
- 同步原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
相关产品推荐
相关产品推荐

