首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpringBoot JmsListener:忽略TypeId

SpringBoot JmsListener:忽略TypeId
EN

Stack Overflow用户
提问于 2020-09-11 12:16:43
回答 1查看 617关注 0票数 2

我目前正在使用SpringBoot JMS,我有点困惑。

当我在web上使用RestTemplate时,发送方和接收方之间的契约是JSON格式。发送方如何生成JSON (或从哪个类)并不重要。这意味着发送方不必具有与接收方相同的DTO类。

我认为这也适用于JMS。不幸的是,发送方和接收方必须拥有完全相同的类。我觉得这有点不切实际。

当然,我可以向双方发送一个字符串(包含一个JSON)。但我实际上希望Spring自己来做这件事。为了保持代码的简单性,我只想告诉Spring“这里以JSON的形式发送这个对象”。另一方面,只需“将JSON解析到这个对象中”。

当我运行下面的示例时,我得到以下错误消息:org.springframework.messaging.converter.MessageConversionException: Cannot convert from [com.example.demo.MyObject2] to [com.example.demo.MyObject] for org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter$LazyResolutionMessage@3c60bcf

我是不明白这个原则,还是说我的想法太荒谬,不是“正常”的方法,你要做很多事呢?

下面是我的代码(注意:MyObjectMyObject2都只有一个属性(String key)):

代码语言:javascript
复制
@SpringBootApplication
@EnableJms
public class DemoApplication implements CommandLineRunner {

    @Autowired
    private JmsTemplate jmsTemplate;

    public static void main(String[] args) throws IOException {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public MessageConverter jacksonJmsMessageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");

        return converter;
    }

    @JmsListener(destination = "test")
    public void test(MyObject dto) {
        System.out.println(dto);
    }

    @Override
    public void run(String... args) throws Exception {
        MyObject2 obj = new MyObject2();
        obj.setKey("Test me");

        jmsTemplate.convertAndSend("test", obj);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-11 13:44:43

看见

代码语言:javascript
复制
    /**
     * Specify mappings from type ids to Java classes, if desired.
     * This allows for synthetic ids in the type id message property,
     * instead of transferring Java class names.
     * <p>Default is no custom mappings, i.e. transferring raw Java class names.
     * @param typeIdMappings a Map with type id values as keys and Java classes as values
     */
    public void setTypeIdMappings(Map<String, Class<?>> typeIdMappings) {

在转换器上。

在发送端,将MyObject.classmyObject映射到客户端,将myObject映射到MyOtherObject.class

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63846933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档