MQ无法转换LocalDateTime类型信息

238 阅读1分钟

bug回顾

使用RabbitMQ时,代码报错 Failed to convert Message content,异常类型class org.springframework.amqp.support.converter.MessageConversionException

检查MQ相关配置,似乎并没有问题

image.png

最终意识到是LocalDateTime的序列化问题,参考了StackOverflow的文章:stackoverflow.com/questions/5…

解决方案

修改配置类如下

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Configuration
public class MyRabbitConfig {

    /**
     * 消息转换器
     */
    @Bean
    public MessageConverter messageConverter(){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(formatter);
        LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(formatter);

        JavaTimeModule module = new JavaTimeModule();
        module.addSerializer(LocalDateTime.class, localDateTimeSerializer);
        module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(module);
        return new Jackson2JsonMessageConverter(objectMapper);
    }
}