SimpleMessageListenerContainer - Предупреждение ClassNotFoundException при получении сообщения AMQP - PullRequest
1 голос
/ 16 марта 2020

Я только что обновил свое приложение до версии spring-integration-amqp-5.2.4.RELEASE, и когда я получаю сообщение из очереди, все работает нормально, но я заметил предупреждение java.lang.ClassNotFoundException в классе DefaultAmqpHeaderMapper. Я использую кастом DefaultJackson2JavaTypeMapper с IdClassMapping. Как я могу избежать отслеживания предупреждения?

@Bean
public Jackson2JavaTypeMapper defaultJackson2JavaTypeMapper() {
    DefaultJackson2JavaTypeMapper defaultJackson2JavaTypeMapper = new DefaultJackson2JavaTypeMapper();
    Map<String, Class<?>> classMapping = new HashMap<>();
    classMapping.put("event.request", RequestDTO.class);
    defaultJackson2JavaTypeMapper.setIdClassMapping(classMapping);
    return defaultJackson2JavaTypeMapper;
}

@Bean
public MessageConverter messageConverterJson(ObjectMapper objectMapper) {
    Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter(objectMapper);
    messageConverter.setJavaTypeMapper(defaultJackson2JavaTypeMapper());
    return messageConverter;
}

LOG предупреждение

o.s.i.a.support.DefaultAmqpHeaderMapper  : error occurred while mapping from AMQP properties to MessageHeaders

java.lang.IllegalStateException: java.lang.ClassNotFoundException: event.request
    at org.springframework.integration.mapping.support.JsonHeaders.getClassForValue(JsonHeaders.java:89)
    at org.springframework.integration.mapping.support.JsonHeaders.buildResolvableType(JsonHeaders.java:72)
    at org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper.createJsonResolvableTypHeaderInAny(DefaultAmqpHeaderMapper.java:169)
    at org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper.extractStandardHeaders(DefaultAmqpHeaderMapper.java:155)
    at org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper.extractStandardHeaders(DefaultAmqpHeaderMapper.java:61)
    at org.springframework.integration.mapping.AbstractHeaderMapper.toHeaders(AbstractHeaderMapper.java:266)
    at org.springframework.integration.mapping.AbstractHeaderMapper.toHeadersFromRequest(AbstractHeaderMapper.java:203)
    at org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper.toHeadersFromRequest(DefaultAmqpHeaderMapper.java:337)
    at org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper.toHeadersFromRequest(DefaultAmqpHeaderMapper.java:61)
    at org.springframework.integration.amqp.inbound.AmqpInboundGateway$Listener.convert(AmqpInboundGateway.java:351)
    at org.springframework.integration.amqp.inbound.AmqpInboundGateway$Listener.onMessage(AmqpInboundGateway.java:314)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1579)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1498)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1486)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1477)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1421)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:963)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:913)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:81)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1284)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1190)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: event.request
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:92)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:282)
    at org.springframework.integration.mapping.support.JsonHeaders.getClassForValue(JsonHeaders.java:86)
    ... 21 common frames omitted

1 Ответ

1 голос
/ 16 марта 2020

Поскольку вы уже отобразили сообщение AMQP в целевую полезную нагрузку с помощью Jackson2JsonMessageConverter, похоже, вам вообще не нужны никакие входящие заголовки.

Чтобы избежать этого предупреждения и дополнительного задания отображения, я предлагаем вам ввести пользовательский AmqpHeaderMapper. Возможно, просто расширение к DefaultAmqpHeaderMapper, когда вы возвращаете пустые заголовки для отображения из запроса:

amqpInboundGateway.setHeaderMapper(new DefaultAmqpHeaderMapper(null, null) {

        @Override
        public Map<String, Object> toHeadersFromRequest(MessageProperties source) {
            return new HashMap<>();
        }

    });

С другой стороны, это просто ПРЕДУПРЕЖДЕНИЕ: вы можете просто уменьшить уровень регистрации до ОШИБКИ для этого org.springframework.integration.amqp.inbound category.

Дело в том, что мы не можем просто игнорировать такую ​​ошибку, если не можем найти класс для заголовка __Type__. Фреймворк не может предположить, что вы ожидаете.

Другой возможный способ исправить это удалить заголовок JSON из MessageProperties.getHeaders() в расширении Jackson2JsonMessageConverter при переопределении fromMessage().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...