返回介绍

Spring 系列

MyBatis

Netty

Dubbo

Tomcat

Redis

Nacos

Sentinel

RocketMQ

番外篇(JDK 1.8)

学习心得

Spring MessageConverter

发布于 2024-05-19 21:34:34 字数 7415 浏览 0 评论 0 收藏 0

Spring MessageConverter

  • Author: HuiFer
  • 源码阅读仓库: SourceHot-spring
  • 源码路径: org.springframework.messaging.converter.MessageConverter

MessageConverter

  • 消息转换接口
  • 类图如下 image-20200305085013723
  • 两个方法

  • fromMessage: 从消息转换到 Object

        Object fromMessage(Message<?> message, Class<?> targetClass);
  1. toMessage: 从 Object 转换到消息
        Message<?> toMessage(Object payload, @Nullable MessageHeaders headers);
序号class作用
1ByteArrayMessageConverterbyte 数组消息转换器
2MappingJackson2MessageConverterjackson2 的消息转换器
3MarshallingMessageConverterxml 的消息转换器
4StringMessageConverter字符串消息转换器

AbstractMessageConverter

类图:

image-20200305085845017

fromMessage

    @Override
    @Nullable
    public final Object fromMessage(Message<?> message, Class<?> targetClass) {
        return fromMessage(message, targetClass, null);
    }

    @Override
    @Nullable
    public final Object fromMessage(Message<?> message, Class<?> targetClass, @Nullable Object conversionHint) {
        if (!canConvertFrom(message, targetClass)) {
            return null;
        }
        return convertFromInternal(message, targetClass, conversionHint);
    }


    // 子类实现
    @Nullable
    protected Object convertFromInternal(
            Message<?> message, Class<?> targetClass, @Nullable Object conversionHint) {

        return null;
    }
  • 真正的转换过程
    @Override
    protected Object convertFromInternal(Message<?> message, Class<?> targetClass, @Nullable Object conversionHint) {
        Charset charset = getContentTypeCharset(getMimeType(message.getHeaders()));
        Object payload = message.getPayload();
        return (payload instanceof String ? payload : new String((byte[]) payload, charset));
    }

toMessage

    @Override
    @Nullable
    public final Message<?> toMessage(Object payload, @Nullable MessageHeaders headers) {
        return toMessage(payload, headers, null);
    }
    @Override
    @Nullable
    public final Message<?> toMessage(Object payload, @Nullable MessageHeaders headers, @Nullable Object conversionHint) {
        if (!canConvertTo(payload, headers)) {
            return null;
        }
        // 子类实现
        Object payloadToUse = convertToInternal(payload, headers, conversionHint);
        if (payloadToUse == null) {
            return null;
        }

        MimeType mimeType = getDefaultContentType(payloadToUse);
        if (headers != null) {
            MessageHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(headers, MessageHeaderAccessor.class);
            if (accessor != null && accessor.isMutable()) {
                if (mimeType != null) {
                    accessor.setHeaderIfAbsent(MessageHeaders.CONTENT_TYPE, mimeType);
                }
                // 创建信息对象
                return MessageBuilder.createMessage(payloadToUse, accessor.getMessageHeaders());
            }
        }

        MessageBuilder<?> builder = MessageBuilder.withPayload(payloadToUse);
        if (headers != null) {
            builder.copyHeaders(headers);
        }
        if (mimeType != null) {
            builder.setHeaderIfAbsent(MessageHeaders.CONTENT_TYPE, mimeType);
        }
        return builder.build();
    }
  • org.springframework.messaging.converter.StringMessageConverter#convertToInternal

        @Override
        @Nullable
        protected Object convertToInternal(
                Object payload, @Nullable MessageHeaders headers, @Nullable Object conversionHint) {
    
            if (byte[].class == getSerializedPayloadClass()) {
                // 获取编码
                Charset charset = getContentTypeCharset(getMimeType(headers));
                // 获取byte数组
                payload = ((String) payload).getBytes(charset);
            }
            return payload;
        }
    
  • 创建Message对象

        @SuppressWarnings("unchecked")
        public static <T> Message<T> createMessage(@Nullable T payload, MessageHeaders messageHeaders) {
            Assert.notNull(payload, "Payload must not be null");
            Assert.notNull(messageHeaders, "MessageHeaders must not be null");
            if (payload instanceof Throwable) {
                return (Message<T>) new ErrorMessage((Throwable) payload, messageHeaders);
            }
            else {
                return new GenericMessage<>(payload, messageHeaders);
            }
        }
    
        @SuppressWarnings("unchecked")
        public Message<T> build() {
            if (this.originalMessage != null && !this.headerAccessor.isModified()) {
                return this.originalMessage;
            }
            MessageHeaders headersToUse = this.headerAccessor.toMessageHeaders();
            if (this.payload instanceof Throwable) {
                return (Message<T>) new ErrorMessage((Throwable) this.payload, headersToUse);
            }
            else {
                return new GenericMessage<>(this.payload, headersToUse);
            }
        }
    
  • 两种创建方式基本相同,如果出现异常组装异常消息对象ErrorMessage,成功创建GenericMessage

image-20200305090846313

从类图上看ErrorMessageGenericMessage的子类

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文