【问题标题】:Spring Boot doesn't read the default value from the application.properties fileSpring Boot 不会从 application.properties 文件中读取默认值
【发布时间】:2019-05-20 03:55:05
【问题描述】:

我有这个 propelr.properties:

elasticsearch.port=443
elasticsearch.protocol=https
elasticsearch.index=contentlink
elasticsearch.type=cl
kafka.max-poll-records=1000
kafka.topic=es-indexer-topic
kafka.group.id=espn-content-link-kafka-es-connector-group
kafka.concurrency-level=4

我得到端口的这个文件:

@Component
final class ElasticSearchClientFactory extends 
AbstractFactoryBean<RestHighLevelClient> {

    private final RestHighLevelClient client;

    ElasticSearchClientFactory(
            final @Value("${elasticsearch.hostname}") String hostname,
            final @Value("${elasticsearch.port}") int port,
            final @Value("${elasticsearch.protocol}") String protocol
    ) {
        client = new RestHighLevelClient(RestClient.builder(new 
 HttpHost(hostname, port, protocol)));
    }

    @Override
    public Class<?> getObjectType() {
        return RestHighLevelClient.class;
    }

    @Override
    protected RestHighLevelClient createInstance() throws Exception {
        return client;
    }

    @Override
    public void destroy() throws Exception {
        if (Objects.nonNull(client)) {
            client.close();
        }
    }
}

而这部分代码就是@Configuration 所在的地方:

@EnableKafka
@Configuration
public class KafkaReceiverConfig {

@Value("${contentlink.kafka.bootstrap.servers}")
private String bootstrapServers;
@Value("${kafka.group.id}")
private String kafkaGroupId;
@Value("${kafka.max-poll-records}")
private String kafkaMaxPollRecords;
@Value("${kafka.concurrency-level}")
private int kafkaConcurrencyLevel;

private EspnMetricRegistry metricRegistry;

@Bean
public KafkaReceiver receiver(
        @Value("${elasticsearch.index}") final String index,
        @Value("${elasticsearch.type}") final String type,
        final RestHighLevelClient client, final EspnMetricRegistry metricRegistry) {
    return new KafkaReceiver(index, type, metricRegistry, client);
}

@Bean
public ConcurrentKafkaListenerContainerFactory<String, ESPNEntity>  kafkaListenerContainerFactory() {
  ConcurrentKafkaListenerContainerFactory<String, ESPNEntity> factory =
      new ConcurrentKafkaListenerContainerFactory<>();
  factory.setConsumerFactory(kafkaConsumerFactory());
  factory.setBatchListener(true);
  factory.setConcurrency(kafkaConcurrencyLevel);
  return factory;
}

@Bean
public ConsumerFactory<String, ESPNEntity> kafkaConsumerFactory() {
    final Deserializer<String> key = new StringDeserializer();
    final Deserializer<ESPNEntity> value = new ESPNEntitySerde(new ESPNEntityConverter());
    return new DefaultKafkaConsumerFactory<>(consumerConfigs(), key, value);
}

@Bean
public Map<String, Object> consumerConfigs() {
    Map<String, Object> props = new HashMap<>();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ESPNEntitySerde.class);
    props.put(ConsumerConfig.GROUP_ID_CONFIG, kafkaGroupId);
    props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, kafkaMaxPollRecords);
    props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
    return props;
}

}

所以,我不知道是什么导致了这个错误或者我错过了什么,但是当我部署到 aws 时,堆栈卡住了,因为当它到达 springboot 的部分时,它会失败并抛出这些错误:

2018-12-19 16:28:45.381 ERROR 43 --- [ main] o.s.boot.SpringApplication : Application startup failed

java.lang.IllegalArgumentException: Could not resolve placeholder 'elasticsearch.port' in value "${elasticsearch.port}"

【问题讨论】:

  • 你可能错过了@PropertySource("classpath:propelr.properties")
  • @Glains 我应该把那条线放在哪里?在@configuration 之前?
  • 通常在任何@Configuration 类或带有@SpringBootApplication 注释的类上,但任何bean 都应该工作。

标签: java maven properties


【解决方案1】:

您需要注册您的属性文件。在@Component 注解下添加这一行:

@PropertySource("classpath:propelr.properties")

所以它应该是这样的:

@Component
@PropertySource("classpath:propelr.properties")
final class ElasticSearchClientFactory extends 
AbstractFactoryBean<RestHighLevelClient> {

private final RestHighLevelClient client;

ElasticSearchClientFactory(
        final @Value("${elasticsearch.hostname}") String hostname,
        final @Value("${elasticsearch.port}") int port,
        final @Value("${elasticsearch.protocol}") String protocol
) {
    client = new RestHighLevelClient(RestClient.builder(new 
 HttpHost(hostname, port, protocol)));
}

@Override
public Class<?> getObjectType() {
    return RestHighLevelClient.class;
}

@Override
protected RestHighLevelClient createInstance() throws Exception {
    return client;
}

@Override
public void destroy() throws Exception {
    if (Objects.nonNull(client)) {
        client.close();
    }
}
}

编辑 静态属性源占位符

@Bean   
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {      
    return new PropertySourcesPlaceholderConfigurer(); 
}

【讨论】:

  • 啊,好吧,我不知道。感谢您提供信息
  • 我应该把@Bean 模块放在哪里?在@Configuration 里面?
  • 尝试不使用该 bean,仅使用该属性源
  • 它不起作用:(我想我需要添加@Bean模块,我在哪里可以添加它?在@Configuration里面?
  • 同样的错误。我编辑了这个问题。我添加了@Configuration 文件的位置,并更好地解释了错误是什么
【解决方案2】:

正如@Rafal 所说,您应该指定@propertySource("classpath:application.properties") 您必须提供正确的路径和要从中读取属性的文件名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多