Как обработать нулевой тип содержимого с помощью Jackson2JsonMessageConverter в Spring-AMQP - PullRequest
0 голосов
/ 11 марта 2019

Если это не одна проблема , это другая ... Кажется, я исправил 2 предыдущие проблемы, но теперь, когда работаю вне тестового контекста, с остановленнымПриложение Я вижу это.

o.s.a.s.c.Jackson2JsonMessageConverter   : Could not convert incoming message with content-type [null], 'json' keyword missing.

Как и раньше, это сообщение кажется довольно ясным.Черт, все даже работало в автономном тестовом контексте, однако при запуске на автономном сервере код, похоже, идет по другому пути и дает сбой по той же причине, но через другой компонент.

@Configuration
open class MessagingConfig {

    @Bean
    open fun jackson2Json(om: ObjectMapper): SmartMessageConverter {
        return Jackson2JsonMessageConverter(om)
    }

    @Bean
    open fun mappingJackson2(om: ObjectMapper): MappingJackson2MessageConverter {
        val mc = MappingJackson2MessageConverter()
        mc.objectMapper = om
        return mc
    }

    @Bean
    open fun defaultMessageHandlerMethodFactory(jackson: MappingJackson2MessageConverter): DefaultMessageHandlerMethodFactory {
        val factory = DefaultMessageHandlerMethodFactory()
        factory.setMessageConverter(jackson)
        return factory
    }


    @Bean
    open fun builder(): Jackson2ObjectMapperBuilderCustomizer {
        return Jackson2ObjectMapperBuilderCustomizer {
            it.modules(JavaTimeModule(), KotlinModule())
            it.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
        }
    }


    @Configuration
    open class RabbitConfigurer(val dmhmf: DefaultMessageHandlerMethodFactory) : RabbitListenerConfigurer {
        override fun configureRabbitListeners(registrar: RabbitListenerEndpointRegistrar?) {
            registrar?.messageHandlerMethodFactory = dmhmf
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Вы можете добавить MessagePostprocessor к фабрике контейнеров, чтобы улучшить сообщение свойством content_id.

factory.setAfterReceivePostProcessors(m -> {
    m.getMessageProperties().setContentId("application/json");
    return m;
}
0 голосов
/ 11 марта 2019

Согласно логике в AbstractJackson2MessageConverter, требуется свойство contentType AMQP:

MessageProperties properties = message.getMessageProperties();
    if (properties != null) {
        String contentType = properties.getContentType();
        if (contentType != null && contentType.contains(this.supportedContentType.getSubtype())) {

Я думаю, что нам нужно внести улучшения в этот компонент, не будьте строгими с ним.Точно так же, как мы можем сделать с MappingJackson2MessageConverter через:

/**
 * Whether this converter should convert messages for which no content type
 * could be resolved through the configured
 * {@link org.springframework.messaging.converter.ContentTypeResolver}.
 * <p>A converter can configured to be strict only when a
 * {@link #setContentTypeResolver contentTypeResolver} is configured and the
 * list of {@link #getSupportedMimeTypes() supportedMimeTypes} is not be empty.
 * <p>When this flag is set to {@code true}, {@link #supportsMimeType(MessageHeaders)}
 * will return {@code false} if the {@link #setContentTypeResolver contentTypeResolver}
 * is not defined or if no content-type header is present.
 */
public void setStrictContentTypeMatch(boolean strictContentTypeMatch) {

, что по умолчанию равно false.

Только способ преодолеть проблему с пропущенным contentType, но все же приступим к преобразованию сообщений JSON, я вижу в пользовательской реализации org.springframework.amqp.support.converter.AbstractMessageConverter, где вы можете комбинировать логику Jackson2JsonMessageConverter и не заботиться о пропущенном свойстве contentType.

Не стесняйтесь подниматьпроблема с Spring AMQP для улучшения AbstractJackson2MessageConverter!

...