在注释值中使用 SPEL 时需要帮助吗?

问题描述 投票:0回答:3

尝试了下面的SPEL表达式,但它不起作用。需要帮助!

@KafkaListener(topics = "#{Arrays.asList(${kafka.topic.helloworld}.split(',')).stream().map(p -> p+envSuffix).toArray(String[]::new)}")
lambda spring-annotations spring-el spring-kafka
3个回答
2
投票

解决方案是:将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);
}

1
投票

首先,我看到

${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 中有一个集合投影功能,但您仍然需要到处进行数组操作。


-2
投票

@Tuneit 你可以像这样直接设置kafka主题。 @KafkaListener(topics = "${kafka.topic.helloworld}")

应用程序属性 kafka.topic.helloworld=

© www.soinside.com 2019 - 2024. All rights reserved.