症状:
调用时,此子流的组件(JdbcMessageHandler)不是从消息中提取参数,而是试图从静态bean中提取参数。
异常消息:
org.springframework.dao.InvalidDataAccessApiUsageException:没有为SQL参数ALC_startTime提供值:bean类的无效属性ALC_startTime[org.springframework.integration.jdbc.JdbcMessageHandler1美元]:Bean属性ALC_startTime不可读或getter方法无效:getter的返回类型是否与setter的参数类型匹配?
SQL
Delete from SB_STREAM.TT_9321383
WHERE (LASTUPDATESTAMP >= to_timestamp (:ALC_startTime, 'YYYY-MM-DD HH24:MI:SS.FF')
and LASTUPDATESTAMP <= to_timestamp (:ALC_endTime, 'YYYY-MM-DD HH24:MI:SS.FF'))
AND ttkey = BIGINT(:ID)
AND (ttobjectname = :ALC_object AND ttschema = :ALC_schema)
流程:
return flowDef
.filter(getFilterExpression(rule)).channel(new DirectChannel())
.handle(inboundAdapter) // a JdbcOutboundAdapter
.split(insertDeleteSplitter)
.publishSubscribeChannel(taskExecutor, c ->
c.subscribe(s -> s
.filter ("....")
.transform(genericTransformer)
.handle(insertUpdateMessageHandler(rule))) // a JDBCMessageHandler
.subscribe(s -> s
.filter("....")
.transform(genericTransformer)
.handle(deleteMessageHandler(rule))) // a JDBCMessageHandler
.subscribe(sub -> sub
.handle(cleanupMessageHandler(rule))) // a JDBCMessageHandler
.errorHandler(new CustomErrorHandler() //
);
清理消息处理程序
private MessageHandler cleanupMessageHandler(RuleMetadata rule) {
<snip ...>
SQLTextAndParamsList sql = sqlFactory.getCleanupSQL(rule);
JdbcMessageHandler handler = new JdbcMessageHandler(dbprx.getDatasource(), sql.getSql());
return handler;
}
编辑:代码更改
生成的SQL已更新为:
Delete from SB_STREAM.TT_9321383
WHERE (LASTUPDATESTAMP >= to_timestamp (:payload[ALC_startTime], 'YYYY-MM-DD HH24:MI:SS.FF')
and LASTUPDATESTAMP <= to_timestamp (:payload[ALC_endTime], 'YYYY-MM-DD HH24:MI:SS.FF'))
AND ttkey = :payload[ID]
AND (ttobjectname = :payload[ALC_object] AND ttschema = :payload[ALC_schema])
根据您的第一个屏幕截图,消息的有效负载是一个数组列表,它确实没有ALC\u开始时间、ALC\u结束时间属性。数组列表上没有这些getter!
为了能够读取列表的内容,您需要在您的JdbcMessageHandler
上配置ExpressionEvalatingSqlParameterSourceFactory
。有关更多信息,请参阅文档:https://docs.spring.io/spring-integration/docs/current/reference/html/jdbc.html#passing-parameters-by-using-spel-expressions.
也许最好以某种方式将列表转换为映射或一些POJO表示。有了这个列表,你很难仅仅通过索引来确定目标值。。。
编辑:这是一个批量更新,因此映射的数组列表是正确的。
SQL参数中的SPEl表达式格式不正确。正确的形式是:有效载荷[ALC\U startTime]。
不一致js是一个用于Discord的API,允许开发人员为程序Discord制作插件。这是js中API代码的链接,https://github.com/hydrabolt/discord.js/ 不和谐被设置成像一个服务器,你在那里连接和聊天的渠道,我的问题是我如何从渠道拉消息数据。 他们所做的是在JSON缓存中设置所有通道,在通道中,对象是另一个带有消息对象的缓存(留档所说的)。但是当我到达消息
我要求从主题中读取消息,对它们进行批处理,然后将批处理推送到外部系统。如果批处理因任何原因失败,我需要再次使用同一组消息并重复该过程。因此,对于每个批处理,每个分区的 from 和 to 偏移量都存储在数据库中。为了实现这一点,我通过向读取器分配分区来为每个分区创建一个Kafka使用者,基于先前存储的偏移量,使用者寻求该位置并开始读取。我已关闭自动提交,并且不提交来自使用者的偏移量。对于每个批处理
这是我从MPI ELAN获得的数据,它是该程序中使用的关于电影的文件: 我想从这个键中提取值:“TIME\u ORIGIN”:“82199”,我认为这是JSON数组,但我做不到。
关于静态和动态之间的区别,我仍然有点困惑。据我所知,动态使用对象,而静态使用类型,动态在运行时解析,而静态在编译时解析。所以this.lastName.compare(s1.last名称)不应该使用动态绑定吗? 钥匙compareTo(list[position-1])使用动态绑定 (this . last name . compare to(S1 . last name))为什么使用静态绑定?
亲爱的, 我已经创建了一个junit5测试用例(UserDaoTests.java),但无法在spring配置文件(data.xml)中定义DataSource Bean。 数据junit的xml配置文件。我在其中定义了数据源bean jdbc。属性: JUnit测试(UserDaoTests.java) 日志: 我还想澄清一下,我使用静态数据源,因为我需要使用@BeforeAll,它只需要静态字