簡體   English   中英

Spring Boot中的Kafka配置類找不到密鑰庫或信任庫

[英]Kafka Configuration class in Spring Boot not finding keystore or truststore

我正在設置Kafka使用者配置,但該配置在類路徑上找不到密鑰庫或信任庫:

@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;
    }
}

密鑰庫和信任庫都位於與配置類相同的maven模塊中的目錄src/main/resources/ssl中。

我在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技術可以很好地解決同一應用程序中反應式WebClient配置的密鑰庫和信任庫。

我需要怎么做才能解決Kafka配置的類路徑? 我在這里想念什么嗎?

您注入一個String,它將“ classpath:”保留在String值內,並將其作為屬性提供給DefaultKafkaConsumerFactory,請嘗試注入spring資源,例如:

import org.springframework.core.io.Resource;

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

然后,您可以訪問文件,並且可以獲取絕對路徑,例如:

resourceFile.getFile().getAbsolutePath()

這個想法是您可以提供DefaultKafkaConsumerFactory的絕對路徑

但是您也可以嘗試刪除“ classpath:”,並像當前代碼一樣將其作為String注入,這可能取決於DefaultKafkaConsumerFactory處理該屬性的方式。 但是我看不到為什么上面的絕對路徑不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM