java - 由 : org. springframework.jms.support.converter.MessageConversionException 引起:无法在消息上找到类型 id 属性 [_type]

标签 java spring-boot jackson jsm

我正在尝试这个 Spring JMS 示例,但它给出了错误。 https://spring.io/guides/gs/messaging-jms/ 原因:org.springframework.jms.support.converter.MessageConversionException:无法在来自目标 [queue://mailbox] 的消息上找到类型 id 属性 [_type] 有趣的是,如果我克隆它并运行一切都运行良好。如果我复制并粘贴,则会出现错误。

 @Bean // Serialize message content to json using TextMessage
public MessageConverter jacksonJmsMessageConverter() {
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
    converter.setTargetType(MessageType.TEXT);
    converter.setTypeIdPropertyName("_type");
    return converter;
}

这段代码实际上导致了错误。搜索网络和文档,我仍然不知道如何以及设置 setTypeIdPropertyName 值以及“_type”在该项目中指的是什么?既然消息没有这样的属性,那么它是从哪里来的呢?

最佳答案

TypeIdPropertyName 是标识实体的属性名称。 Jackson 映射器应该知道反序列化传入 JSON 时要使用哪个实体。

请求应如下所示:

{  
   "_type" : "hello.Email",
   "to" : "Imran",
   "from" : "dzatorsky"
}

顺便说一句,我认为这不是最好的解决方案,因为 JMS 已经知道要使用什么类型(您在方法中声明它)。另一个缺点是您在消息中指定实体和包的名称,这将很难维护(包或实体名称的每次更改都会很痛苦)。

这是更强大的配置:

@EnableJms
@Configuration
public class JmsListenerConfig implements JmsListenerConfigurer {

    @Bean
    public DefaultMessageHandlerMethodFactory handlerMethodFactory() {
        DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
        factory.setMessageConverter(messageConverter());
        return factory;
    }

    @Bean
    public MessageConverter messageConverter() {
        return new MappingJackson2MessageConverter();
    }

    @Override
    public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
        registrar.setMessageHandlerMethodFactory(handlerMethodFactory());
    }
}

此外,如果您使用 Spring JmsTemplate 发送消息,您可以将此组件添加到您的配置中:

/**
 * Used to convert JMS messages from/to JSON. Registered in Spring-JMS automatically via auto configuration
 */
@Component
public class JsonMessageConverter implements MessageConverter {

    @Autowired
    private ObjectMapper mapper;

    /**
     * Converts message to JSON. Used mostly by {@link org.springframework.jms.core.JmsTemplate}
     */
    @Override
    public javax.jms.Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
        String json;

        try {
            json = mapper.writeValueAsString(object);
        } catch (Exception e) {
            throw new MessageConversionException("Message cannot be parsed. ", e);
        }

        TextMessage message = session.createTextMessage();
        message.setText(json);

        return message;
    }

    /**
     * Extracts JSON payload for further processing by JacksonMapper.
     */
    @Override
    public Object fromMessage(javax.jms.Message message) throws JMSException, MessageConversionException {
        return ((TextMessage) message).getText();
    }
}

通过此配置,您可以跳过消息中烦人的“_type”字段。

关于java - 由 : org. springframework.jms.support.converter.MessageConversionException 引起:无法在消息上找到类型 id 属性 [_type],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45526371/

相关文章:

java - 在类之间传递数组值

java spring Boot - 如何渲染 html 页面

spring - Jackson ObjectWriter 只从流中写入第一个条目

java - 使用 JAX-RS 和 Jackson 将 JPA 实体转换为 REST 表示的最佳方法

java - Android 类型 new View.OnClickListener(){} 未定义方法 startActivity(Intent)

java - 使用 Ivy-Ant : Unauthorized by Credentials? 在 nexus 中发布工件

java - 文件名中带有时间戳的 Logback 文件未滚动

java - 在 Spring Boot 应用程序中嵌入带有作业定义的 Spring Batch Admin

spring-boot - UserInfoEndpoint 中缺少客户端注册所需的 UserInfo Uri

java - 使用 Google Http Java Client 将嵌套的 JSON 节点解析为 POJO