【问题标题】:Not able to convert Message from Json String to Object. ClassCastException无法将消息从 Json 字符串转换为对象。 ClassCastException
【发布时间】:2020-02-08 18:47:50
【问题描述】:

我正在使用 SpringXD,我有一个带有 outputType application/json 的 Rabbit Source。下一个模块接收它并将其转换为 Java 对象。 RabbitMq 是我的传输总线。

我的配置很标准,比如:

@EnableIntegration
@ImportResource("classpath:some.xml")
@ComponentScan(basePackages = "com.something")
public class MyConfigClass {

    @Autowired
    private Jackson2JsonObjectMapper jackson2JsonObjectMapper;  


    @Bean
    public MessageChannel input() {
        return new DirectChannel();
    }

    @Bean
    public MessageChannel inputObject() {
        return new DirectChannel();
    }  

    @Bean
    public MessageChannel output() {
        return new DirectChannel();
    }

    @Bean
    public MessageChannel outputObject() {
        return new DirectChannel();
    }

    @Bean
    public Jackson2JsonObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JodaModule());
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return new Jackson2JsonObjectMapper(mapper);
    }

    @Bean
    @Transformer(inputChannel = "input", outputChannel = "inputObject")
    public JsonToObjectTransformer jsonToObjectTransformer() {
        return new JsonToObjectTransformer(someTargetClass.class, jackson2JsonObjectMapper);
    }

    @Bean
    @Transformer(inputChannel = "outputObject", outputChannel = "output")
    public ObjectToJsonTransformer objectToJsonTransformer() {
        return new ObjectToJsonTransformer(jackson2JsonObjectMapper);
    }
}

然后在另一个班级我有这样的事情:

public class AnotherClass {


    @Transformer(inputChannel = "inputObject", outputChannel = "outputObject")
    public Message<someTargetClass> transform(Message<someTargetClass> incoming) {

        //Here I'm getting Caused by: org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException: java.lang.String cannot be cast to com.whatever.someTargetClass

        SomeTargetClass messagePayload = incoming.getPayload();
    }
} 

所以流程是input->inputObject-outputObject->output

但不知何故,我得到了一个 classCastException 作为输入负载,它以字符串而不是 Java 对象(someTargetClass 类型)的形式出现。

Caused by: org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException: java.lang.String cannot be cast to com.whatever.someTargetClass
at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:96) ~[spring-integration-core-4.2.5.RELEASE.jar:na]
at org.springframework.integration.transformer.AbstractMessageProcessingTransformer.transform(AbstractMessageProcessingTransformer.java:90) ~[spring-integration-core-4.2.5.RELEASE.jar:na]
at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:89) ~[spring-integration-core-4.2.5.RELEASE.jar:na]
... 52 common frames omitted

因此,不知何故,通过渠道的流量似乎无法正常工作。我错过了什么?

【问题讨论】:

    标签: java spring spring-integration spring-cloud-dataflow spring-xd


    【解决方案1】:

    我的理论是source正在生成一个字符串,json没有被传输,当transformer接收到字符串时无法将其转换为SomeTargetClass。如果这是真的,这应该可以解决它:

    在transform方法改变:

    SomeTargetClass messagePayload = incoming.getPayload();

    到:

    String jsonString = incoming.getPayload();
    SomeTargetClass messagePayload = (SomeTargetClass) JSON.std.beanFrom(SomeTargetClass.class, jsonString);
    

    这是使用 Jackson Jr,但我相信您可以在 Jackson 中找到替代品。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多