【问题标题】:SpringXD: ClassCastException of same class between modules in a streamSpringXD:流中模块之间相同类的ClassCastException
【发布时间】:2015-09-12 22:11:41
【问题描述】:

我有一个自定义 Spring XD 源模块,它使用 Spring Social for Twitter 并输出 Tweet 对象。这工作得很好。我可以记录源的输出并查看列出的 Tweet 对象。我可以将该流的源输出类型更改为 application/json 以查看 JSON 的输出。这按预期工作。

然后我创建了一个处理器模块,该模块将从该推文创建一个新对象并将其输出。转换消息需要一个包含 Tweet 对象作为其有效负载的 GenericMessage(我也尝试过让方法参数只是 Tweet,但这也不起作用)。

@Transformer
public OtherThing<Tweet> transform(GenericMessage<Tweet> message) {
    // ... snip ...
}

但是,当我将两个模块链接在一起时

stream create --name test --definition 'my-tweet-source-module | my-tweet-processor | log' --deploy

从源模块输出一条推文,我得到一个类转换异常:

java.lang.ClassCastException: org.springframework.social.twitter.api.Tweet cannot be cast to org.springframework.social.twitter.api.Tweet

我已经验证两个模块都使用相同版本的 Spring Social Twitter,所以应该没有问题。目前,模块通过本地传输进行通信,因此这也不应该是任何类加载问题(它们最终需要通过非本地传输进行通信)。

我也尝试过解决方法,例如在流中定义源模块的输出类型应为application/json,然后尝试从输入字符串有效负载中读取 JSON,但由于 Spring Social 的性质推特反对,杰克逊不遵守。

我想知道为什么会发生这种情况以及我应该如何解决这个问题?我觉得我无疑做错了什么。如果我不被允许这样做,我想知道为什么会这样以及应该做的事情是什么。

任何帮助将不胜感激。

谢谢

编辑:我使用的是 Spring XD 1.2.1.RELEASE

【问题讨论】:

    标签: spring-integration spring-xd spring-social-twitter


    【解决方案1】:

    ClassCastException when casting to the same class。这几乎可以肯定是类加载器问题。尝试从模块的类路径中删除 spring-social 并将其添加到 xd/lib 以便它由同一个类加载器加载。

    【讨论】:

    • 前几天我实际上正在尝试这个,但收到一个关于压缩 jar 的错误。我提取了内容并根据互联网所说的将jar重新创建为未压缩的,但仍然给我压缩错误。会再试一次看看。
    • 所以最终我认为你是正确的。我能够通过 unjaring、rejaring w/零压缩和放入 libs 目录来摆脱错误。但是,我收到了其他错误,因为该 jar 的依赖项不在 xd/lib 目录中。对我来说,跟踪每个需要的 jar,解压缩,然后重新压缩解压缩,只是为了让 java 序列化工作,是不切实际的。我将继续使用 jackson/boon 或 kryo 进行序列化。谢谢你的回答,因为我真的被困住了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多