Java SpringBoot JmsListener:忽略TypeId

Java SpringBoot JmsListener:忽略TypeId,java,spring-boot,spring-jms,Java,Spring Boot,Spring Jms,我目前正在使用SpringBoot JMS,我有点困惑 当我在web上使用RestTemplate时,发送方和接收方之间的契约是JSON格式。发送方如何生成JSON(或从哪个类生成)并不重要。这意味着发送方不必具有与接收方相同的DTO类 我假设同样的情况也适用于JMS。不幸的是,发送方和接收方必须具有完全相同的类。我觉得这有点不切实际 当然,我可以在两侧发送一个字符串(包含JSON)。但我真的希望Spring能自己做到这一点。为了使代码保持简单,我只想告诉Spring“在这里以JSON的形式发送

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

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

我假设同样的情况也适用于JMS。不幸的是,发送方和接收方必须具有完全相同的类。我觉得这有点不切实际

当然,我可以在两侧发送一个字符串(包含JSON)。但我真的希望Spring能自己做到这一点。为了使代码保持简单,我只想告诉Spring“在这里以JSON的形式发送这个对象”。另一方面,只需“将JSON解析为这个对象”

当我运行下面的示例时,会收到以下错误消息:
org.springframework.messaging.converter.MessageConversionException:无法将org.springframework.jms.listener.adapter.AbstractAdapteableMessageListener$MessagingMessageConverterAdapter从[com.example.demo.MyObject2]转换为[com.example.demo.MyObject2]$LazyResolutionMessage@3c60bcf

我只是不理解这个原则,还是我的想法太荒谬了,以至于这不是“正常”的方式,你不得不手工做很多事情

这是我的代码(注意:
MyObject
MyObject2
都只有一个属性(String
key
):

/**
*如果需要,指定从类型ID到Java类的映射。
*这允许在类型id消息属性中使用合成id,
*而不是传输Java类名。
*默认情况下没有自定义映射,即传输原始Java类名。
*@param typeIdMappings以类型id值作为键,以Java类作为值的映射
*/
public void setTypeIdMappings(映射参见

/**
*如果需要,指定从类型ID到Java类的映射。
*这允许在类型id消息属性中使用合成id,
*而不是传输Java类名。
*默认情况下没有自定义映射,即传输原始Java类名。
*@param typeIdMappings以类型id值作为键,以Java类作为值的映射
*/
公共void setTypeIdMappings(映射
@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);
    }
}