Spring boot 如何解析spring属性列表
我有一个Spring boot application.propertiesSpring boot 如何解析spring属性列表,spring-boot,spring-kafka,spring-el,Spring Boot,Spring Kafka,Spring El,我有一个Spring boot application.properties list1=valueA,valueB list2=valueC list3=valueD,valueE topics=list1,list2,list3 我试图做的是在@KafkaListener注释的topics元素中使用topics属性值 使用表达式 @KafkaListener(topics={"#{'${topics}'.split(',')}"}) 我将list1,list2,li
list1=valueA,valueB
list2=valueC
list3=valueD,valueE
topics=list1,list2,list3
我试图做的是在@KafkaListener
注释的topics
元素中使用topics属性值
使用表达式
@KafkaListener(topics={"#{'${topics}'.split(',')}"})
我将list1
,list2
,list3
作为分隔字符串
如何在此列表上循环以获取valueA
,valueB
,valueC
,值
,值
编辑:我必须解析主题
属性,以便@KafkaListener注册使用来自主题valueA
、valueB
、valueC
等的消息
我了解到可以通过以下方式调用方法:
@KafkaListener(topics="#parse(${topics})")
@KafkaListener(topics="#{Arrays.stream('${topics}'.split(',')).map(key->${key}).toArray(String[]::new)}")
所以,我写了这个方法:
public String[] parse(String s) {
ExpressionParser parser = new SpelExpressionParser();
return Arrays.stream(s.split(",").map(key -> (String)(parser.parse(key).getValue())).toArray(String[]::new);
}
但不会调用parse
方法
所以,我尝试直接在注释中这样做
这样:
@KafkaListener(topics="#parse(${topics})")
@KafkaListener(topics="#{Arrays.stream('${topics}'.split(',')).map(key->${key}).toArray(String[]::new)}")
但是这个解决方案也给了我错误
编辑2:
以这种方式修改调用的方法
@KafkaListener(topics="parse()")
@Bean
public String[] parse(String s) {
...
}
问题是如何在方法中获得“主题”道具您不能调用这样的任意方法;您需要引用一个bean
@someBean.parse(…)
;使用#parse
需要将静态方法注册为函数
但是,这对我来说是可行的,而且要简单得多:
list1=valueA,valueB
list2=valueC
list3=valueD,valueE
topics=${list1},${list2},${list3}
及
编辑
如果您不能在主题中使用占位符
,则此操作有效
@springboot应用程序
公共类SO64390079应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(So64390079Application.class,args);
}
@KafkaListener(id=“so64390079”,topics=“#{@parser.parse(“${topics}”))
公共void侦听(字符串输入){
系统输出打印项次(输入);
}
}
@组成部分
类解析器实现环境感知{
私人环境;
@凌驾
公共环境(环境){
this.environment=环境;
}
公共字符串[]解析(字符串[]主题){
StringBuilder sb=新的StringBuilder();
for(字符串主题:主题){
sb.append(this.environment.getProperty(主题));
某人附加(“,”);
}
返回StringUtils.commadelimitedListToStringaray(sb.toString().substring(0,sb.length()-1));
}
}
不清楚你的意思<代码>主题采用字符串[]
。确定。我正试图解决这个问题:@KafkaListener(topics=“#{parse($(topics))}”)
。parse方法返回Arrays.stream(s.split(“,”).map(p->“${p}”).toArray(String[]::new)代码>。我知道${p}
在map中没有任何意义,但是这个方法没有被调用;编辑问题以准确显示您正在尝试做什么,以及问题是什么。我编辑了问题。我希望现在已经很清楚了。我想这样做,但要求topics属性必须是topics=list1、list2、list3
格式。似乎可以工作,但它被调用了两次,第二次调用会产生StringIndexOutOfBoundException,因为topics参数为空。为什么调用两次?我不知道;在我的测试应用程序中只调用一次;试着设置一个断点,看看它是否提供了任何线索。您可以随时添加代码来防止这种情况。(if(sb.length()>0
)。在调试模式下检查,第一次得到正确的输出,但第二次得到错误。非常奇怪。