如何在spring KafkaListener annotation中为group-id使用环境值

mum43rcc  于 2023-04-28  发布在  Spring
关注(0)|答案(2)|浏览(102)

的值。env文件,并尝试将值Group-id放入@KafkaListener中:

Dotenv dotenv = Dotenv.load();
final String KAFKA_GROUP_ID = dotenv.get("SOME_KAFKA_GROUPID");

@KafkaListener(topics = "some_topic", groupId = KAFKA_GROUP_ID, containerFactory = "some_container_name")

IDEA说Kafka_GROUP_ID必须是常量。我已经尝试了Kafka_GROUP_ID的所有修改,但都没有成功。
如何获取Kafka_GROUP_ID常量?

4c8rllxm

4c8rllxm1#

在Sping Boot 中,可以使用@Value注解读取系统环境属性或Spring环境属性

Spring @Value - Spring环境属性

@Value("${APP_NAME_NOT_FOUND}")
private String defaultAppName;

如果在spring环境属性中找不到该键,则属性值将为${APP_NAME_NOT_FOUND}。我们可以分配一个默认值,如果spring环境属性中缺少键,该值将被分配。

@Value("${APP_NAME_NOT_FOUND:Default}")
private String defaultAppName;

Spring @Value -系统环境

当Spring环境被填充时,它读取所有系统环境变量并将其存储为属性。因此,我们也可以使用@Value注解来分配系统变量。

@Value("${java.home}")
private String javaHome;

@Value("${HOME}")
private String homeDir;

Spring @Value - SpEL

我们也可以使用带有@Value注解的Spring表达式语言。所以我们也可以使用SpEL读取java的home系统属性。

@Value("#{systemProperties['java.home']}")
private String javaHome;
quhf5bfb

quhf5bfb2#

您可以编写一个EnvironmentPostProcessor,它使用Dotenv加载属性,然后将其 Package 在PropertySource中。这样你就可以使用常规的Spring机制来替换值了。

public DotenvEnvironmentProcessor implements EnvironmentPostProcessor {

@Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, 
      SpringApplication application) {

      Dotenv dotenv = Dotenv.load();
      Properties envProps = new Properties();
      for (DotenvEntry entry : dotenv.entries()) {
        envProps.setProperty(entry.getKey(), entry.getValue());
      }
      environment.getPropertySources()
          .addAfter(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, new PropertiesPropertySource("dotenv", envProps);
    }
}

这将把Dotenv加载的属性注册到Spring用来替换值的Environment中。

**注意:**您也可以编写一个专用的PropertySource实现,它封装了Dotenv并使用它。您可以通过扩展EnumerablePropertySource并实现它来实现这一点。

现在您可以像通常使用Spring一样引用属性。

@KafkaListener(topics = "some_topic", groupId = "${SOME_KAFKA_GROUPID}", containerFactory = "some_container_name")

这可能也会简化你正在使用的引用Dotenv的其他代码,因为你可以删除它并使用普通的Spring机制(你甚至可以将属性移动到你的application.properties或yaml或特定于配置文件的属性)。

相关问题