我目前正在使用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
我是不明白这个原则,还是说我的想法太荒谬,不是“正常”的方法,你要做很多事呢?
下面是我的代码(注意:MyObject和MyObject2都只有一个属性(String 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);
}
}发布于 2020-09-11 13:44:43
看见
/**
* 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.class从myObject映射到客户端,将myObject映射到MyOtherObject.class。
https://stackoverflow.com/questions/63846933
复制相似问题