Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何解析spring属性列表_Spring Boot_Spring Kafka_Spring El - Fatal编程技术网

Spring boot 如何解析spring属性列表

Spring 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

我有一个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
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
)。在调试模式下检查,第一次得到正确的输出,但第二次得到错误。非常奇怪。