如何在 Spring Cloud Stream 项目中将传入的标头映射为 String 而不是 byte[]?

Gab*_*man 5 spring spring-integration spring-cloud-stream spring-kafka spring-integration-dsl

我有一个使用 Spring Integration DSL 流和 Kafka 绑定器的简单 Spring Cloud Stream 项目。一切正常,但来自 Kafka 的消息头值以byte[].

这意味着我的 SI@Header参数需要是 类型byte[]。哪个有效,但最好将它们作为字符串(我关心的所有入站标头都是字符串值)。

我已经将 Kafka 客户端配置为使用 StringSerializer/StringDeserializer。我假设我还需要以某种方式告诉 Spring Kafka 哪些标头映射为字符串以及使用什么字符编码。

我显然在这里遗漏了一些东西。有小费吗?

Gar*_*ell 4

将binder 属性设置headerMapperBeanName为bean 的bean 名称DefaultKafkaHeaderMapper

spring.cloud.stream.kafka.binder.headerMapperBeanName

KafkaHeaderMapper 的 bean 名称,用于将 spring-messaging 标头映射到 Kafka 标头或从 Kafka 标头映射。例如,如果您希望在DefaultKafkaHeaderMapper使用 JSON 反序列化标头的 a 中自定义受信任的包,请使用此选项。

然后,您可以指定要由映射器将哪些标头映射为字符串:

/**
 * Set the headers to not perform any conversion on (except {@code String} to
 * {@code byte[]} for outbound). Inbound headers that match will be mapped as
 * {@code byte[]} unless the corresponding boolean in the map value is true,
 * in which case it will be mapped as a String.
 * @param rawMappedHeaders the header names to not convert and
 * @since 2.2.5
 * @see #setCharset(Charset)
 * @see #setMapAllStringsOut(boolean)
 */
public void setRawMappedHeaders(Map<String, Boolean> rawMappedHeaders) {
Run Code Online (Sandbox Code Playgroud)