首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MessageConversionException:未能解析Spring中的类名

MessageConversionException:未能解析Spring中的类名
EN

Stack Overflow用户
提问于 2016-08-25 06:03:24
回答 2查看 6.1K关注 0票数 4

我正在使用Spring和jackson2JsonMessageConverter来尝试简单的发送和接收消息。另外,_TypeId_在这里的意义是什么,为什么它要显示带有类名的发件人包?我在收到信息时遇到了一些问题。

下面是我的配置

org.springframework.amqp.support.converter.MessageConversionException:未能解析类名。未找到org.springframework.amqp.support.converter.DefaultJackson2JavaTypeMapper.getClassIdType(DefaultJackson2JavaTypeMapper.java:121) at org.springframework.amqp.support.converter.DefaultJackson2JavaTypeMapper.toJavaType(DefaultJackson2JavaTypeMapper.java:90) at org.springframework.amqp.support.converter.Jackson2JsonMessageConverter.fromMessage(Jackson2JsonMessageConverter.java:145) at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.extractMessage的org.springframework.amqp.helloworld.User( org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:288) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:777) ). 10种常见帧省略原因: java.lang.ClassNotFoundException: org.springframework.amqp.helloworld.User at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase在org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1139) at org.springframework.util.ClassUtils.forName(ClassUtils.java:250) at org.springframework.util.ClassUtils.forName(ClassUtils.java:250) at org.springframework.amqp.support.converter.DefaultJackson2JavaTypeMapper.getClassIdType(DefaultJackson2JavaTypeMapper.java:118) .省略了15种常见帧

XML配置

代码语言:javascript
运行
复制
            <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
            xmlns:context="http://www.springframework.org/schema/context"
            xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
            xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mvc="http://www.springframework.org/schema/mvc"
            xmlns:rabbit="http://www.springframework.org/schema/rabbit"
            xsi:schemaLocation="http://www.springframework.org/schema/rabbit
             http://www.springframework.org/schema/rabbit/spring-rabbit.xsd
             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
             http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd  
             http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd  
             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
             http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">


            <rabbit:connection-factory id="connectionFactory"
                        channel-cache-size="25" host="10.165.18.29" username="BipUser"
                        password="bip" />

            <rabbit:queue name="Job Queue"></rabbit:queue>

            <rabbit:queue name="Input Queue"></rabbit:queue>

            <rabbit:queue name="More Info Queue"></rabbit:queue>

            <rabbit:queue name="Adaptor O/P Queue"></rabbit:queue>

            <rabbit:queue name="Command Queue"></rabbit:queue>

            <rabbit:queue name="Error Queue"></rabbit:queue>

            <bean id="simpleMessageConverter"
                        class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter">
            </bean>

            <rabbit:template id="amqpTemplate" connection-factory="connectionFactory"
                        message-converter="jsonConverterWithDefaultType" />

            <rabbit:listener-container
                        connection-factory="connectionFactory" auto-declare="true"
                        message-converter="simpleMessageConverter" auto-startup="true"
                        acknowledge="auto">
                        <rabbit:listener ref="rabbitMQJobListener"
                                    queue-names="Job Queue" priority="10" />

            </rabbit:listener-container>

            <rabbit:admin connection-factory="connectionFactory" id="amqpAdmin" />

            <bean id="rabbitMQJobListener" class="com.bosch.bip.rabbitmq.consumer.RabbitMQJobListener">
            </bean>

            <rabbit:annotation-driven container-factory="rabbitListenerContainerFactory" />

            <bean id="rabbitListenerContainerFactory"
                        class="org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory">
                        <property name="connectionFactory" ref="connectionFactory"></property>
                        <property name="messageConverter" ref="jsonConverterWithDefaultType"></property>
            </bean>

            <bean id="jsonConverterWithDefaultType"
                        class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter">
                        <property name="classMapper">
                                    <bean class="org.springframework.amqp.support.converter.DefaultClassMapper">
                                    </bean>
                        </property>
            </bean>
</beans>

发件人

代码语言:javascript
运行
复制
package org.springframework.amqp.helloworld;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.DefaultClassMapper;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class Sender {


            public static void main(String[] args) {

                        ApplicationContext context = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
                        User user=new User();
                        user.setPassword("welcome");
                        user.setUserName("welcome");
                        user.setXml("myxml");
                        RabbitTemplate rabbitTemplate = context.getBean(RabbitTemplate.class);

                        Jackson2JsonMessageConverter converter = context.getBean(Jackson2JsonMessageConverter.class);
                        MessageProperties properties = new MessageProperties();
                        properties.setHeader("user", "user");
                        properties.setContentType(MessageProperties.CONTENT_TYPE_JSON);
                        Message message = converter.toMessage(user, properties);

                        System.out.println(message);



                        rabbitTemplate.send(message);
            }

            /* @RabbitListener(queues = HelloWorldConfiguration.helloWorldQueueName)
              public void handleMessage(User user) {
               System.out.println("User Values::::::::"+user.getPassword());
              }*/
}

消费者

代码语言:javascript
运行
复制
package com.bip.rabbitmq.consumer;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import com.bip.entity.User;

@EnableRabbit
@Component
public class RabbitMQJobListener {


            @RabbitListener(queues="Job Queue")
            public void onMessage(User message) {
                        System.out.println(new String(message.getPassword()));

            }
}

RabbitMQ

代码语言:javascript
运行
复制
Exchange    (AMQP default)
Routing Key Job Queue
Redelivered ○
Properties  
priority:   0
delivery_mode:  2
headers:    
user:   user
__TypeId__: org.springframework.amqp.helloworld.User
content_encoding:   UTF-8
content_type:   application/json
Payload
57 bytes
Encoding: string
{"userName":"welcome","password":"welcome","xml":"myxml"}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-25 12:43:34

_TypeID_头设置为出站,以告诉入站要将JSON转换为哪个类。如果要转换为与JSON类型兼容的不同类,则必须配置转换器。

如果它总是同一个类,则使用自定义ClassMapper (而不是默认的)。

或者,请参阅这个测试、其监听程序它的结构,以了解如何配置不同的类型映射。

票数 7
EN

Stack Overflow用户

发布于 2022-07-12 08:17:36

当序列化实例的包名与使用者的模型不同时(由headers: TypeId表示),可能会发生这种情况。

我相信,以身作则会使事情更清楚。

模式:类型为扇出的Exchange x.invoice绑定到q.invoice队列。

生产者:我们用Id com.example.produceronequeuemultipletypes.model.InvoiceCreatedMessage.类型发送JSON消息类ParseConfig是为了帮助我们避免将实例手动序列化为字符串。

代码语言:javascript
运行
复制
public void sendInvoiceMessages() {
    invoiceCreatedMessage.setId(0);
    invoiceCreatedMessage.setType("Invoice Created");
    rabbitTemplate.convertAndSend("x.invoice", "", invoiceCreatedMessage);   
}

class InvoiceCreatedMessage {
    private String type;
    private int id;
}

@Configuration
class ParseConfig {
    @Bean
    public ObjectMapper getObjectMapper() {
        return new ObjectMapper();
    }

    @Bean
    public Jackson2JsonMessageConverter getConverter(
            @Autowired ObjectMapper objectMapper) {
        return new Jackson2JsonMessageConverter(objectMapper);
    }
}

使用者:使用从"com.example.produceronequeuemultipletypes.model.InvoiceCreated“到InvoiceCreated.class的映射创建一个类映射bean。

代码语言:javascript
运行
复制
@Slf4j
@Service
public class InvoiceConsumer {
    @RabbitListener(queues = "q.invoice")
    public void handleInvoiceCreated(
            InvoiceCreatedMessage invoiceCreatedMessage) {
        log.info("[Created] Invoice " + invoiceCreatedMessage);
    }
}

@Configuration
class ParseConfig {
    @Bean
    public ObjectMapper getObjectMapper() {
        return new ObjectMapper();
    }

    @Bean
    public Jackson2JsonMessageConverter getConverter(
            @Autowired ObjectMapper objectMapper) {
        Jackson2JsonMessageConverter messageConverter =
        new Jackson2JsonMessageConverter(objectMapper);
        messageConverter.setClassMapper(getClassMapper());
        return messageConverter;
    }

    @Bean
    public DefaultClassMapper getClassMapper() {
        DefaultClassMapper classMapper = new DefaultClassMapper();
        Map<String, Class<?>> map = new HashMap<>();
        map.put(
        "com.example.produceronequeuemultipletypes.model." + 
        "InvoiceCreatedMessage",
        InvoiceCreatedMessage.class)
        classMapper.setIdClassMapping(idClassMapping);
        return classMapper;
    }
}

class InvoiceCreatedMessage {
    private String type;
    private int id;
}

参考资料:

  1. https://docs.spring.io/spring-amqp/reference/html/#json-message-converter
  2. https://www.udemy.com/course/rabbitmq-java-spring-boot-for-system-integration/
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39137746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档