简体   繁体   English

无法将消息从 Json 字符串转换为对象。 类转换异常

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

I'm using SpringXD where I have a Rabbit Source with outputType application/json.我正在使用 SpringXD,其中有一个带有 outputType application/json 的 Rabbit Source。 Next module receive it and convert it to Java Object.下一个模块接收它并将其转换为 Java 对象。 RabbitMq is my transport bus. RabbitMq 是我的运输巴士。

My configuration is pretty standard like:我的配置非常标准,例如:

@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);
    }
}

Then in another class I have something like this:然后在另一个班级我有这样的事情:

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();
    }
} 

So the flow is input->inputObject-outputObject->output所以流程是 input->inputObject-outputObject->output

But somehow I'm getting a classCastException as Input payload coming as a String and not as a Java Object (someTargetClass type).但不知何故,我得到了一个 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

So, Somehow looks like the flow through the channels is not working properly.因此,不知何故,通过渠道的流量似乎无法正常工作。 What am I missing?我错过了什么?

My theory is that the source is producing a string, the fact that is json is not being transmitted, when the transformer receives the string can not convert it to SomeTargetClass.我的理论是源正在生成一个字符串,实际上是 json 没有被传输,当转换器接收到字符串时,无法将其转换为 SomeTargetClass。 If this is true, this should fix it:如果这是真的,这应该解决它:

In the transform method change:在变换方法中更改:

SomeTargetClass messagePayload = incoming.getPayload();

to :到 :

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

This is using Jackson Jr, but I am sure you can find the replacement in Jackson.这是使用 Jackson Jr,但我相信您可以在 Jackson 中找到替代品。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM