尝试了下面的SPEL表达式,但它不起作用。需要帮助!
@KafkaListener(topics = "#{Arrays.asList(${kafka.topic.helloworld}.split(',')).stream().map(p -> p+envSuffix).toArray(String[]::new)}")
解决方案是:将lambda添加到注释中的方法之一如下:
在KafkaReceiver类的方法中:
@Autowired TopicUtil topicUtil;
@KafkaListener(topics = "#{topicUtil.suffixTopics()}")
//In the TopicUtil - add the follwoing method
public String[] suffixTopics() {
return Arrays.asList(pTopics.split(",")).stream().map(p -> p + envSuffix).toArray(String[]::new);
}
首先,我看到
${kafka.topic.helloworld}
必须包装到 ''
,因为属性占位符首先起作用,然后 SpEL 会将结果视为活动变量。例如你那里,foo,bar,baz
。它在 Java 中看起来怎么样?无非就是错误的代码。但是当它是 "foo,bar,baz"
时,语言就知道它是一个字符串。 SpEL 也是如此 - 它一定像 '${kafka.topic.helloworld}'
。
但这还不是全部。恐怕 SpEL 不支持 lambda。我建议你有一些实用程序 bean,你可以从这个表达式中调用它,例如:
@KafkaListener(topics = "myUtility.parseTopics('${kafka.topic.helloworld}')")
所有硬转换逻辑都将在
parseTopics()
实用程序 Java 方法中完成。
SpEL 中有一个集合投影功能,但您仍然需要到处进行数组操作。
@Tuneit 你可以像这样直接设置kafka主题。 @KafkaListener(topics = "${kafka.topic.helloworld}")
应用程序属性 kafka.topic.helloworld=