Spring 消息传递与不同包中的模型

问题描述 投票:0回答:1

这就是我正在尝试做的事情:

应用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
值传递的包。

  1. 为什么我们甚至需要传递任何包相关信息?它泄露了不需要的信息...

  2. 处理这些情况的正确方法是什么?这应该是很常见的情况吧?

编辑:

在加里·拉塞尔的帮助下我解决了这个问题。这就是您想要做的。

在生产者和消费者中定义具有所需类型的映射器:

@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
    消费者和生产者中的密钥匹配

通过这种方式,您可以使用一个映射器来匹配两个服务之间的多个对象。

spring-jms
1个回答
1
投票

/**
 * 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...
)。

© www.soinside.com 2019 - 2024. All rights reserved.