Весенние сообщения с моделями в разных пакетах - PullRequest
0 голосов
/ 25 декабря 2018

Вот что я пытаюсь сделать:

Приложение 1 (потребитель)

com.producer.model.Event - простая сериализуемая модель (идентификатор, имя)

Приложение 2 (производитель)

com.consumer.integration.model.Event - простая сериализуемая модель (идентификатор, имя)

Конфигурация сериализации

@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 ключи совпадают в потребителе и производителе

Таким образом, вы можете сопоставить несколько объектов между двумя службами одним сопоставителем.

1 Ответ

0 голосов
/ 25 декабря 2018

См.

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

На стороне производителя сопоставьте исходный класс с идентификатором типа, а на стороне потребителя сопоставьте идентификатор типа с классом назначения.

(Вот почему он называетсяMappingJackson...).

...