我正在尝试配置如下的流(直接从jdbc源管道到jdbc接收器)
XD> stream create test2 --definition“output:jdbc --split = true --username = test --password = test --driverClassName = com.mysql.jdbc.Driver --url = jdbc:mysql:// dbhost:3306 / test --query ='select id,test from test'| input:jdbc --username = test --password = test --driverClassName = com.mysql.jdbc.Driver --tableName = test2 --columns = id,name --url = jdbc:mysql:// dbhost:3306 / test“--deloy
但发生ClassCastException。
引起:java.lang.ClassCastException:org.springframework.util.LinkedCaseInsensitiveMap无法强制转换为java.lang.String 在org.springframework.xd.jdbc.JdbcMessagePayloadTransformer.transformPayload(JdbcMessagePayloadTransformer.java:39) 在org.springframework.integration.transformer.AbstractPayloadTransformer.doTransform(AbstractPayloadTransformer.java:33) 在org.springframework.integration.transformer.AbstractTransformer.transform(AbstractTransformer.java:33) ......还有147个
MySQL连接和表模式似乎已正确配置。连通已经确认。
CREATE TABLE test(id int,name varchar(20)); CREATE TABLE test2(id int,name varchar(20))
Spring XD版本是1.1.0.BUILD-20141103.163150-1-dist,来自下方的拉链。
我想将有效负载数据存储到目标接收器表,但功能是否还在实验中?
或者,它是流问题,例如只是进行某种转换吗?
答案 0 :(得分:3)
就像Gary说的那样,接收器需要一个JSON文档(有一个优秀的JIRA票证来改善接收器以接受Map)。现在,您可以使用--outputType = application / json让源生成JSON文档而不是Map。这是我刚试过的一个例子:
stream create jdbcCp --definition "source:jdbc --query='select id,name,year from myfiles where status = 0' --maxRowsPerPoll=10 --update='update myfiles set status = 1 where id in (:id)' --outputType=application/json | sink:jdbc --tableName=newfiles --columns=id,name,year" --deploy
答案 1 :(得分:1)
请参阅the documentation - 接收器需要一个简单的String有效负载或一个将转换为Map
的JSON字符串。当List
为真时,源会生成Map
Map
个s(或单个split
)。
目前,接收器没有直接处理Map的选项;您可以添加transform
模块以将Map
转换为JSON或创建自定义接收器。
我们应该更改接收器以接受Map
。