Spring Integration преобразует Base64 в JsonObject

Мой проект состоит из трех основных блоков: протокол MQTT, RabbitMQ в качестве брокера и Spring Integration.

Протокол MQTT отправляет закодированную строку eyJrZXkiOiJIZWxsbyBXb3JsZCJ9 брокеру, а Spring Integration потребляет и обрабатывает данные.

Как я могу декодировать/кодировать данные IntegrationFlow из Base64 eyJrZXkiOiJIZWxsbyBXb3JsZCJ9 в JsonObject {"key":"Hello World"}?

Какую функцию мне следует использовать из IntegrationFlow: Convert(), Transform() или Handle()? Какая логическая разница между этими тремя? Можете ли вы показать мне пример кода, как кодировать и декодировать данные.

    @Bean
    IntegrationFlow inboundFlow(MqttPahoMessageDrivenChannelAdapter inboundAdapter){
        return IntegrationFlow
                .from(inboundAdapter)
                .transform( ... )  // How to implement decoder
                .handle((payload, headers) -> {
                    System.out.println(payload);
                    return null;
                })
                .get();
    }

Что-то вроде transform(String.class, (in) -> Base64.getDecoder().decode(in)) должно помочь.

M. Deinum 21.02.2024 16:18
0
1
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Большая часть EIP — это просто варианты активатора службы, который представляет собой handle() в Java DSL. Все это предназначено для конкретного случая использования и удобства для ограниченной области применения. Поэтому вы можете просто реализовать свой собственный активатор службы для выполнения этой работы. В вашем случае действительно достаточно использовать transform(), поскольку он играет роль для преобразования полезной нагрузки сообщения.

Преобразование вам не поможет, поскольку вы не выполняете преобразование из одного типа в другой. У вас просто есть строка на входе, и, возможно, вы хотите иметь строку на выходе. Поэтому преобразование типов не требуется.

Как прокомментировал Мартин, вы можете использовать этот простой преобразователь:

transform(String.class, (in) -> Base64.getDecoder().decode(in))

В результате вы получите byte[]. Дальше вы можете сделать с этим что-нибудь еще.

Если я правильно понимаю, я могу использовать цепочку преобразователей для достижения необходимого типа данных? .transform(String.class, (in) -> new String(Base64.getDecoder().decode(in))) .transform(Transformers.fromJson()) .handle((полезная нагрузка, заголовки) -> { System.out .println(payload); return null; }) Мое первое преобразование декодирует Base64 в строку Json, и в следующем .transform(Transformers.fromJson()) таким образом я могу получить JsonObject?

Romillion 21.02.2024 19:22

Да. Правильно. Хотя вам не нужно заключать результат декодирования Base64 в строку. JsonToObjectTransformer может справиться с byte[]. Вместо этого вы можете подумать об использовании Transformers.fromJson(JsonObject.class). Если это именно тот тип, который вы ожидаете в своем приложении.

Artem Bilan 21.02.2024 19:56

Артем, можешь пожалуйста ответить на этот вопрос stackoverflow.com/questions/78097626/…

Romillion 04.03.2024 00:09

Другие вопросы по теме