yaml文件中的Spring引导加载属性文件

时间:2017-05-04 21:32:01

标签: java spring-boot

我有一个application.yml文件,里面调用属性文件

在我的IDE(eclipse)中执行时我没有问题,但是当在控制台(使用java -jar)中运行jar时,它不会加载在YAML文件中设置的属性文件。

这是我的application.yml

    apache:
  kafka:
    producer:
      properties: kafka-producer-${application.environment}.properties
    consumer:
      properties: kafka-consumer-${application.environment}.properties

这里是.properties

#
# Apache Kafka Consumer Properties
##
bootstrap.servers=XXXX:9092
group.id=consumers
enable.auto.commit=true
auto.commit.interval.ms=1000
key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
session.timeout.ms=300000
request.timeout.ms=305000

我正在加载这样的属性文件:

@Value("${apache.kafka.producer.properties}")
    private String kafkaProducerProperties;

    @Bean
    public KafkaProducer<String, String> eventProducer() {

        try {
            Properties properties = new Properties();
            properties.load(this.context.getResource("classpath:" + this.kafkaProducerProperties).getInputStream());

            return new KafkaProducer<String, String>(properties);
        } catch (final IOException exception) {
            LOG.error("Error loading Kafka producer properties", exception);
        }

        return null;
    }

在IDE中执行this.kafkaProducerProperties具有正确的值,而执行jar则为null。

我做错了什么,为什么它在IDE中加载,但没有执行jar?

1 个答案:

答案 0 :(得分:0)

请尝试此代码

 @Bean
 public KafkaProducer<String, String> eventProducer() {

    try {
        Properties properties = new Properties();
        properties.put("bootstrap.servers","XXXX:9092");
        properties.put("group.id","consumers");
        properties.put("enable.auto.commit","true");
        properties.put("auto.commit.interval.ms","1000");
        properties.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
        properties.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
        properties.put("session.timeout.ms","300000");
        properties.put("request.timeout.ms","305000");

        return new KafkaProducer<String, String>(properties);
    } catch (final IOException exception) {
        LOG.error("Error loading Kafka producer properties", exception);
    }
    // Avoid return null in your code instead throw an exception
    throw new IllegalAccessException("Error loading Kafka producer properties");
}

为避免硬编码,您也可以这样做 1-在你的application.yml

中添加它
bootstrap.servers: XXXX
group.id: consumers
enable.auto.commit: true
auto.commit.interval.ms: 1000
key.deserializer: org.apache.kafka.common.serialization.StringDeserializer
value.deserializer: org.apache.kafka.common.serialization.StringDeserializer
session.timeout.ms: 300000
request.timeout.ms: 305000

2-添加此代码

@Value("${bootstrap.servers}")
private String bootstrapServers;
@Value("${group.id}")
private String groupId;
@Value("${enable.auto.commit}")
private String enableAutoCommit;
@Value("${auto.commit.interval.ms}")
private String autoCommit;
@Value("${key.deserializer}")
private String keyDeserializer;
@Value("${value.deserializer}")
private String valueDeserializer;
@Value("${session.timeout.ms}")
private String sessionTimeout;
@Value("${request.timeout.ms}")
private String requestTimeout;

@Bean
 public KafkaProducer<String, String> eventProducer() {

    try {
        Properties properties = new Properties();
        properties.put("bootstrap.servers",bootstrapServers+"9092");
        properties.put("group.id",groupId);
        properties.put("enable.auto.commit",enableAutoCommit);
        properties.put("auto.commit.interval.ms",autoCommit);
        properties.put("key.deserializer",keyDeserializer);
        properties.put("value.deserializer",valueDeserializer);
        properties.put("session.timeout.ms",sessionTimeout);
        properties.put("request.timeout.ms",requestTimeout);

        return new KafkaProducer<String, String>(properties);
    } catch (final IOException exception) {
        LOG.error("Error loading Kafka producer properties", exception);
    }
    // Avoid return null in your code instead throw an exception
    throw new IllegalAccessException("Error loading Kafka producer properties");
}

希望这有帮助。