内容类型和转换
要允许您传播关于已生成消息的内容类型的信息,默认情况下,Spring Cloud Stream附加contentType标头到出站消息。对于不直接支持头文件的中间件,Spring Cloud Stream提供了自己的自动将邮件包裹在自己的信封中的机制。对于支持头文件的中间件,Spring Cloud Stream应用程序可以从非Spring Cloud Stream应用程序接收具有给定内容类型的消息。
Spring Cloud Stream可以通过两种方式处理基于此信息的消息:
-
通过其入站和出站渠道的contentType设置
-
通过对@StreamListener注释的方法执行的参数映射
Spring Cloud Stream允许您使用绑定的spring.cloud.stream.bindings.<channelName
>.content-type属性声明性地配置输入和输出的类型转换。请注意,一般类型转换也可以通过在应用程序中使用变压器轻松实现。目前,Spring Cloud Stream本机支持流中常用的以下类型转换:
-
来自/从POJO的JSON
-
对象到/来自byte []:用于远程传输的原始字节序列化,应用程序发出的字节,或使用Java序列化转换为字节(要求对象为Serializable)
-
字符串到/来自byte []
-
对象到纯文本(调用对象的toString()方法)
其中JSON表示包含JSON的字节数组或字符串有效负载。目前,对象可以从JSON字节数组或字符串转换。转换为JSON总是产生一个String。
如果在出站通道上没有设置content-type属性,则Spring Cloud Stream将使用基于Kryo序列化框架的序列化程序对有效负载进行序列化。在目的地反序列化消息需要在接收者的类路径上存在有效载荷类。
MIME类型
content-type值被解析为媒体类型,例如application/json或text/plain;charset=UTF-8。MIME类型对于指示如何转换为String或byte []内容特别有用。Spring Cloud Stream还使用MIME类型格式来表示Java类型,使用具有type参数的一般类型application/x-java-object。例如,application/x-java-object;type=java.util.Map或application/x-java-object;type=com.bar.Foo可以设置为输入绑定的content-type属性。此外,Spring Cloud Stream提供自定义MIME类型,特别是application/x-spring-tuple来指定元组。
在Spring Cloud Stream中默认提供了一些可以开箱即用的类型转换器,具体如下表所示:
来源有效载荷 | 目标有效载荷 | content-type标题(来源讯息) | content-type标题(转换后) | 注释 |
---|---|---|---|---|
POJO | JSON String | ignored | application/json | |
Tuple | JSON String | ignored | application/json | JSON是为Tuple量身定制的 |
POJO | String (toString()) | ignored | text/plain, java.lang.String | |
POJO | byte[] (java.ioserialized) | ignored | application/x-java-serialized-object | |
JSON byte[] or String | POJO | application/json (or none) | application/x-java-object | |
byte[] or String | Serializable | application/x-java-serialized-object | application/x-java-object | |
JSON byte[] or String | Tuple | application/json (or none) | application/x-spring-tuple | |
byte[] | String | any | text/plain, java.lang.String | 将应用在content-type头中指定的任何Charset |
String | byte[] | any | application/octet-stream | 将应用在content-type头中指定的任何Charset |