gpt4 book ai didi

java - Spring Boot 中的 Kafka 配置类找不到 keystore 或信任库

转载 作者:太空宇宙 更新时间:2023-11-03 13:46:03 26 4
gpt4 key购买 nike

我正在设置 Kafka 消费者配置,但该配置在类路径上找不到 keystore 或信任库:

@EnableKafka
@Configuration
public class KafkaConfig {

@Value("${kafka.ssl.keystore}")
private String keyStorePath;
@Value("${kafka.ssl.truststore}")
private String trustStorePath;

@Bean
public ConsumerFactory<String, String> getConsumerFactory() {

Map<String, Object> properties = new HashMap<>();
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"my-bootstrap.mydomain.com:443");
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
properties.put(ConsumerConfig.GROUP_ID_CONFIG, "group1");
properties.put(ConsumerConfig.CLIENT_ID_CONFIG, "client1");
properties.put("enable.auto.commit", "true");
properties.put("auto.commit.interval.ms", "500");
properties.put("session.timeout.ms", "30000");
properties.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL");
properties.put(SslConfigs.SSL_KEYSTORE_LOCATION_CONFIG, keyStorePath);
properties.put(SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG, "password");
properties.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, trustStorePath);
properties.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, "password");
properties.put(SslConfigs.SSL_KEY_PASSWORD_CONFIG, "password");

return new DefaultKafkaConsumerFactory<>(properties);
}

@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory
= new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(getConsumerFactory());
return factory;
}
}

keystore 和 truststore 都位于目录 src/main/resources/ssl 中,与配置类在同一个 maven 模块中。

我在 application.yml 中设置占位符如下:

kafka:
ssl:
keystore: classpath:ssl/kafka-keystore.jks
truststore: classpath:ssl/kafka-truststore.jks

但是,应用程序启动失败,出现以下异常:

"org.apache.kafka.common.KafkaException: java.io.FileNotFoundException: classpath:ssl/kafka-keystore.jks (No such file or directory)"

我的理解是,使用 @Value 可以使用 classpath: 前缀来解析类路径(请参阅此链接) https://www.baeldung.com/spring-classpath-file-access

此外,@Value 技术可以很好地解析同一应用程序中响应式(Reactive) WebClient 配置的 keystore 和信任库。

我需要做什么来解析 Kafka 配置的类路径?我在这里遗漏了什么吗?

最佳答案

您注入(inject)一个字符串,它将在字符串值中保留“类路径:”并将其作为属性提供给 DefaultKafkaConsumerFactory,尝试注入(inject)一个 spring 资源,例如:

import org.springframework.core.io.Resource;

@Value("classpath:path/to/file/in/classpath")
Resource resourceFile;

然后你可以访问这个文件,你可以得到像这样的绝对路径:

resourceFile.getFile().getAbsolutePath()

您的想法是可以提供 DefaultKafkaConsumerFactory 的绝对路径

但是您也可以尝试删除“类路径:”并像您当前的代码一样注入(inject)字符串,这可能会起作用,具体取决于 DefaultKafkaConsumerFactory 如何处理该属性。但我不明白为什么上面的绝对路径不起作用。

关于java - Spring Boot 中的 Kafka 配置类找不到 keystore 或信任库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57915057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com