簡體   English   中英

無法將消息從 Json 字符串轉換為對象。 類轉換異常

[英]Not able to convert Message from Json String to Object. ClassCastException

我正在使用 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

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

我的理論是源正在生成一個字符串,實際上是 json 沒有被傳輸,當轉換器接收到字符串時,無法將其轉換為 SomeTargetClass。 如果這是真的,這應該解決它:

在變換方法中更改:

SomeTargetClass messagePayload = incoming.getPayload();

到 :

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM