- Author: HuiFer
- 源码阅读仓库: SourceHot-spring
- 源码路径:
org.springframework.messaging.converter.MessageConverter
- fromMessage: 从消息转换到 Object
ObjectfromMessage(Message<?> message, Class<?> targetClass);
- toMessage: 从 Object 转换到消息
Message<?> toMessage(Objectpayload, @NullableMessageHeadersheaders);
序号 | class | 作用 |
---|---|---|
1 | ByteArrayMessageConverter | byte 数组消息转换器 |
2 | MappingJackson2MessageConverter | jackson2 的消息转换器 |
3 | MarshallingMessageConverter | xml 的消息转换器 |
4 | StringMessageConverter | 字符串消息转换器 |
类图:
@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)); }
@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
从类图上看ErrorMessage
是GenericMessage
的子类