Вот что я пытаюсь сделать:
Приложение 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
.
Почему нам даже нужно передавать информацию, связанную с пакетом?Он пропускает информацию, которая не нужна ...
Как правильно обращаться с этими ситуациями.Это должен быть довольно обычный случай?
РЕДАКТИРОВАТЬ:
С помощью Гари Рассела я решил его.Вот что вы хотели бы сделать.
Определите маппер в производителе и потребителе с желаемыми наборами:
@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
ключи совпадают в потребителе и производителе
Таким образом, вы можете сопоставить несколько объектов между двумя службами одним сопоставителем.