Не удалось преобразовать сообщение из Json String в объект. ClassCastException - PullRequest
0 голосов
/ 08 февраля 2020

Я использую SpringXD, где у меня есть Rabbit Source с приложением outputType / json. Следующий модуль получает его и конвертирует в 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

Итак, почему-то похоже, что поток через каналы не работает должным образом. Чего мне не хватает?

1 Ответ

1 голос
/ 12 февраля 2020

Моя теория состоит в том, что источник генерирует строку, тот факт, что json не передается, когда преобразователь получает строку, не может преобразовать ее в SomeTargetClass. Если это правда, это должно исправить это:

В методе преобразования измените:

SomeTargetClass messagePayload = incoming.getPayload();

на:

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

Это используя Джексона младшего, но я уверен, что вы можете найти замену в Джексоне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...