这就是我正在尝试做的事情:
应用1(消费者)
com.producer.model.Event
- 简单的可序列化模型(id,名称)
应用2(生产者)
com.consumer.integration.model.Event
- 简单的可序列化模型(id,名称)
序列化配置
@Bean
public MessageConverter jacksonJmsMessageConverter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type");
return converter;
}
现在当我发出消息时
@Override
public void publishEvent(Event event) {
log.debug("Publish event Event : {}", event);
jmsTemplate.convertAndSend(eventTopic, event);
}
消费者
@Override
@JmsListener(destination = "${jmsConfig.eventTopic}", containerFactory = "topicListenerFactory")
public void handleEvent(Event event) {
log.debug("Received an event {}", event);
}
消费者方投诉型号包装不一样
MessageConversionException: Failed to resolve type id [com.producer.model.Event]
...
Caused by: java.lang.ClassNotFoundException: com.producer.model.Event
因此,消费者中的反序列化失败,因为它找不到带有
_type
值传递的包。
为什么我们甚至需要传递任何包相关信息?它泄露了不需要的信息...
处理这些情况的正确方法是什么?这应该是很常见的情况吧?
编辑:
在加里·拉塞尔的帮助下我解决了这个问题。这就是您想要做的。
在生产者和消费者中定义具有所需类型的映射器:
@Bean
public MessageConverter jacksonJmsMessageConverter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
HashMap<String, Class<?>> typeIdMappings = new HashMap<>();
typeIdMappings.put(Event.class.getSimpleName(), Event.class);
converter.setTypeIdMappings(typeIdMappings);
converter.setTypeIdPropertyName("_type");
return converter;
}
重要的是
setTypeIdPropertyName
消费者和生产者匹配setTypeIdMappings
消费者和生产者中的密钥匹配通过这种方式,您可以使用一个映射器来匹配两个服务之间的多个对象。
看
/**
* 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) {
在生产者端将源类映射到类型 id,在消费者端将类型 id 映射到目标类。
(这就是为什么它被称为
MappingJackson...
)。