Skip to content

Latest commit

 

History

History
186 lines (145 loc) · 5.55 KB

Spring-MessageConverter.md

File metadata and controls

186 lines (145 loc) · 5.55 KB

Spring MessageConverter

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

MessageConverter

  • 消息转换接口
  • 类图如下 image-20200305085013723
  • 两个方法
  1. fromMessage: 从消息转换到 Object
ObjectfromMessage(Message<?> message, Class<?> targetClass);
  1. toMessage: 从 Object 转换到消息
Message<?> toMessage(Objectpayload, @NullableMessageHeadersheaders);
序号class作用
1ByteArrayMessageConverterbyte 数组消息转换器
2MappingJackson2MessageConverterjackson2 的消息转换器
3MarshallingMessageConverterxml 的消息转换器
4StringMessageConverter字符串消息转换器

AbstractMessageConverter

类图:

image-20200305085845017

fromMessage

@Override@NullablepublicfinalObjectfromMessage(Message<?> message, Class<?> targetClass) { returnfromMessage(message, targetClass, null); } @Override@NullablepublicfinalObjectfromMessage(Message<?> message, Class<?> targetClass, @NullableObjectconversionHint) { if (!canConvertFrom(message, targetClass)) { returnnull; } returnconvertFromInternal(message, targetClass, conversionHint); } // 子类实现@NullableprotectedObjectconvertFromInternal( Message<?> message, Class<?> targetClass, @NullableObjectconversionHint) { returnnull; }
  • 真正的转换过程
@OverrideprotectedObjectconvertFromInternal(Message<?> message, Class<?> targetClass, @NullableObjectconversionHint) { Charsetcharset = getContentTypeCharset(getMimeType(message.getHeaders())); Objectpayload = message.getPayload(); return (payloadinstanceofString ? payload : newString((byte[]) payload, charset)); }

toMessage

@Override@NullablepublicfinalMessage<?> toMessage(Objectpayload, @NullableMessageHeadersheaders) { returntoMessage(payload, headers, null); }
@Override@NullablepublicfinalMessage<?> toMessage(Objectpayload, @NullableMessageHeadersheaders, @NullableObjectconversionHint) { if (!canConvertTo(payload, headers)) { returnnull; } // 子类实现ObjectpayloadToUse = convertToInternal(payload, headers, conversionHint); if (payloadToUse == null) { returnnull; } MimeTypemimeType = getDefaultContentType(payloadToUse); if (headers != null) { MessageHeaderAccessoraccessor = MessageHeaderAccessor.getAccessor(headers, MessageHeaderAccessor.class); if (accessor != null && accessor.isMutable()) { if (mimeType != null) { accessor.setHeaderIfAbsent(MessageHeaders.CONTENT_TYPE, mimeType); } // 创建信息对象returnMessageBuilder.createMessage(payloadToUse, accessor.getMessageHeaders()); } } MessageBuilder<?> builder = MessageBuilder.withPayload(payloadToUse); if (headers != null) { builder.copyHeaders(headers); } if (mimeType != null) { builder.setHeaderIfAbsent(MessageHeaders.CONTENT_TYPE, mimeType); } returnbuilder.build(); } 
  • org.springframework.messaging.converter.StringMessageConverter#convertToInternal

    @Override@NullableprotectedObjectconvertToInternal( Objectpayload, @NullableMessageHeadersheaders, @NullableObjectconversionHint) { if (byte[].class == getSerializedPayloadClass()) { // 获取编码Charsetcharset = getContentTypeCharset(getMimeType(headers)); // 获取byte数组payload = ((String) payload).getBytes(charset); } returnpayload; }
  • 创建Message对象

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

image-20200305090846313

从类图上看ErrorMessageGenericMessage的子类

close