小编典典

由以下原因引起:org.springframework.jms.support.converter.MessageConversionException:在消息上找不到类型id属性[_type]

spring-boot

我正在尝试这个Spring的JMS示例,但它给出了错误。 https://spring.io/guides/gs/messaging-
jms/
原因:org.springframework.jms.support.converter.MessageConversionException: Could not find type id property [_type] on message from destination [queue://mailbox] 有趣的是,如果我克隆它并运行一切正常。如果我复制并粘贴,则会出现错误。

 @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”来表示此项目中的含义是什么?由于消息没有这种属性,因此消息来自何处?


阅读 2050

收藏
2020-05-30

共1个答案

小编典典

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”字段。

2020-05-30