无法将Message从Json String转换为Object。 ClassCastException

问题描述 投票:0回答:1

我正在使用SpringXD,其中我的Rabbit源具有outputType application / json。下一个模块将其接收并将其转换为Java Object。 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();
    }
} 

因此流程为输入-> inputObject-outputObject->输出

但是以某种方式,我得到一个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个回答
0
投票

我的理论是,源正在生成一个字符串,事实是json没有被传输,当转换器接收到该字符串时无法将其转换为SomeTargetClass。如果是这样,则应解决此问题:

在变换方法中更改:

SomeTargetClass messagePayload = incoming.getPayload();

至:

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

这是使用杰克逊(Jackson Jr),但我确定您可以在杰克逊(Jackson)中找到替代者。

© www.soinside.com 2019 - 2024. All rights reserved.