簡體   English   中英

SpringBoot JmsListener:忽略 TypeId

[英]SpringBoot JmsListener: Ignore TypeId

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

當我在網絡上使用 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只有一個屬性(字符串key )):

@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);
    }
}

    /**
     * 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM