【问题标题】:PropertySource in spring boot doesn't seem to workSpring Boot 中的 PropertySource 似乎不起作用
【发布时间】:2020-12-15 17:46:04
【问题描述】:

我无法使用 PropertySource 加载 StringDeserializer 和 StringSerializer,但所有其他 spring.kafka 相关的东西都会被加载。

是不是spring PropertySource的bug?

我的常用应用如下所示:

@Configuration
@PropertySource("classpath:/config/kafka.properties")
public class CommonKafkaAutoConfiguration {
}

当文件名 kafka.properties 时没有加载以下配置,但在 application.properties 时没问题

spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer

有趣的事实是在这两种情况下都加载了:

spring.kafka.consumer.max-poll-records=20

更新我可以看到它被 kafkaBinderDefaultProperties 覆盖

【问题讨论】:

  • 什么版本的引导?我只是用 2.4.1 试过没有问题。此外,默认情况下,Boot auto 会为 key 和 value 配置 String(Des|S)erializer
  • 我试过 spring-boot 2.3.7 和 2.4.1 都有同样的错误。
  • 是什么让您认为它不起作用? - 正如我所说,默认情况下它们是String(Des|S)erializers。
  • 因为测试...在运行应用程序和 Spock 测试...我可以看到它在调用 kafka.properties 但没问题 application.properties 时没有加载进一步...我已经缩小它归结为 CommonKafkaAutoConfiguration
  • 我更新了我的问题...它加载了字节序列化器

标签: spring spring-boot spring-kafka spring-cloud-stream spring-cloud-stream-binder-kafka


【解决方案1】:

这对我来说很好......

@SpringBootApplication
@PropertySource("classpath:/config/kafka.properties")
public class So65311053Application {

    public static void main(String[] args) {
        SpringApplication.run(So65311053Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(KafkaTemplate<String, String> template, ConsumerFactory<?, ?> cf) {
        return args -> {
            template.send("so65311053", "foo");

            System.out.println(template.getProducerFactory()
                    .getConfigurationProperties()
                    .get(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG));

            System.out.println(cf.getConfigurationProperties()
                    .get(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG));
        };
    }

    @Bean
    public NewTopic topic() {
        return TopicBuilder.name("so65311053").partitions(1).replicas(1).build();
    }

    @KafkaListener(id = "so65311053", topics = "so65311053")
    void listen(String in) {
        System.out.println(in);
    }

}
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.IntegerDeserializer
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.IntegerSerializer

spring.kafka.consumer.auto-offset-reset=earliest
2020-12-15 13:38:49.154  INFO 4612 --- [           main] o.a.k.clients.consumer.ConsumerConfig    : ConsumerConfig values: 
    allow.auto.create.topics = true
    auto.commit.interval.ms = 5000
    auto.offset.reset = earliest
    ...
    key.deserializer = class org.apache.kafka.common.serialization.IntegerDeserializer
    ...
2020-12-15 13:38:49.211  INFO 4612 --- [           main] o.a.k.clients.producer.ProducerConfig    : ProducerConfig values: 
    ...
    key.serializer = class org.apache.kafka.common.serialization.IntegerSerializer

class org.apache.kafka.common.serialization.IntegerSerializer
class org.apache.kafka.common.serialization.IntegerDeserializer
2020-12-15 13:38:49.349  INFO 4612 --- [o65311053-0-C-1] o.s.k.l.KafkaMessageListenerContainer    : so65311053: partitions assigned: [so65311053-0]
foo

【讨论】:

  • 对我不起作用 :( 它加载 org.apache.kafka.common.serialization.ByteArrayDeserializer
  • 也许 spring-cloud 会覆盖它:S
  • 我看不到您已加载到 KafkaProperties
  • 这不起作用,因为云流注入的KafkaBinderEnvironmentPostProcessor。我通过创建自己的 KafkaBinderEnvironmentPostProcessor 解决了这个问题
  • 您的问题没有提到您正在使用 Kafka 活页夹(直到您编辑它);我已经添加了这些标签。
【解决方案2】:

由于KafkaBinderEnvironmentPostProcessor而发生错误

我通过创建自己的 EnvironmentPostProcessor 解决了这个问题

【讨论】:

  • 您应该接受这个作为保存记录的答案。
  • 谢谢...但两天前我不能接受:(因为这是我自己的答案。
猜你喜欢
  • 2014-12-23
  • 2021-11-02
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 2020-10-10
  • 2015-06-28
  • 2015-05-17
  • 1970-01-01
相关资源
最近更新 更多