当前位置: 首页 > 知识库问答 >
问题:

如何解析spring属性列表

伊铭
2023-03-14

我有这个Spring启动应用程序。属性

list1=valueA,valueB
list2=valueC
list3=valueD,valueE

topics=list1,list2,list3

我想做的是在@KafkaListener主题元素中使用主题属性值的值注释

使用表达式

@KafkaListener(topics={"#{'${topics}'.split(',')}"})

我得到列表1列表2列表3作为分隔字符串

我如何循环到这个列表以获得值A值B值C值D值E

编辑:我必须解析主题属性,以便@KafkaListener注册以使用来自主题value eAvalue eBvalue eC等的消息。

我读到可以通过这种方式调用方法:

@KafkaListener(topics="#parse(${topics})")

所以,我写了这个方法:

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="#{Arrays.stream('${topics}'.split(',')).map(key->${key}).toArray(String[]::new)}")

但是这个解决方案也会给我带来错误。

编辑2:

以这种方式修改会调用该方法

@KafkaListener(topics="parse()")

@Bean
    public String[] parse(String s) {
       ...
    }

问题是如何在方法中获得“主题”道具

共有1个答案

南宫浩皛
2023-03-14

你不能像那样调用任意的方法;您需要引用bean @someBean.parse(...);使用< code>#parse需要将静态方法注册为函数。

然而,这对我很有效,而且简单得多:

list1=valueA,valueB
list2=valueC
list3=valueD,valueE

topics=${list1},${list2},${list3}

@KafkaListener(id = "so64390079", topics = "#{'${topics}'.split(',')}")

编辑

如果您不能在< code >主题中使用占位符,这也可以...

@SpringBootApplication
public class So64390079Application {

    public static void main(String[] args) {
        SpringApplication.run(So64390079Application.class, args);
    }

    @KafkaListener(id = "so64390079", topics = "#{@parser.parse('${topics}')}")
    public void listen(String in) {
        System.out.println(in);
    }

}

@Component
class Parser implements EnvironmentAware {

    private Environment environmment;

    @Override
    public void setEnvironment(Environment environment) {
        this.environmment = environment;
    }

    public String[] parse(String[] topics) {
        StringBuilder sb = new StringBuilder();
        for (String topic : topics) {
            sb.append(this.environmment.getProperty(topic));
            sb.append(',');
        }
        return StringUtils.commaDelimitedListToStringArray(sb.toString().substring(0, sb.length() - 1));
    }

}
 类似资料:
  • “env”为:“org.springframework.core.env.environment” 现在,当我在Eclipse中运行Spring Boot应用程序时,我希望这段代码从类路径中的application.properties获取属性(在project/src/main/resources中),但它使用的是project/config中的另一个application.properties

  • 我想让运行中的Spring(引导)应用程序的所有属性占位符及其解析值都可用于进程监控。在第一步中,可以将它们写入日志,或者创建一个类似于application.pid文件的'resolved.properties'文件。应该考虑使用属性占位符(隐式/显式)的所有属性。 动机:在操作过程中通常很难知道解析属性的值。系统属性或命令行参数是“可见的”,但代码中隐藏的默认值(如)很难找到。我希望能够回答“

  • 我使用pyChume5.0和python3.5。并且我通过pyChume5的内置函数(设置-项目-项目解释器-"")下载了所有的liarbry。其他库看起来不错,但是flask-SQLAlchey出现了一些问题。 我导入烧瓶-SQLAlChemysuccessfully.however,py 我已经尝试了一些方法,但它们不起作用.例如:1.重新启动 2.删除并重新下载 3.刷新缓存。PyCharm

  • 获取以下异常: 原因:org.hibernate.queryException:无法解析属性:primaryAddress:com.hcentive.user.ContactInfo在org.hibernate.persister.entity.abstractPropertyMapping.PropertyException(abstractPropertyMapping.java:62)~[h

  • 问题内容: 我有我的配置: 我得到错误 我知道这可能缺少属性文件,但是我在类路径中恰好有它。有什么不见了? 我的web.xml: 问题答案: 你的应用程序中可能有多个。尝试在超类的方法上设置一个断点,看看在应用程序启动时是否多次调用了该断点。如果不止一个,则可能需要查看配置属性,以便你的应用程序可以正常启动。

  • 问题内容: 我需要解析Java(Android)中来自AppEngine的DateTime字符串。该字符串如下所示:。它是某种标准格式吗?有没有比使用custom更简单的方法? 问题答案: 非常简单,除了日期字符串由于其中的最后一个而有些偏离。只需替换并使用以下模式即可: