当前位置: 首页 > 知识库问答 >
问题:

Spring Boot自动配置加载Spring Kafka属性失败

巢权
2023-03-14

Spring引导加载属性失败。下面是我通过yaml文件使用的属性。

 spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      auto-commit-interval: 100
      enable-auto-commit: true
      group-id: ********************
      auto-offset-reset: earliest
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
    producer:
      batch-size: 16384
      buffer-memory: 33554432
      retries: 0
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
    listener:
      poll-timeout: 20000

我得到的例外是这个

原因:java.lang.IllegalAccessException:Class org.apache.kafka.common.utils.utils无法访问带有“protected”修饰符的类org.springframework.kafka.support.serializer.JsonDeserializer的成员

我认为构造器是受保护的。请提供一种方法来实例化这个。

共有1个答案

葛阳
2023-03-14

没错。见:

protected JsonDeserializer() {
        this((Class<T>) null);
    }

    protected JsonDeserializer(ObjectMapper objectMapper) {
        this(null, objectMapper);
    }

    public JsonDeserializer(Class<T> targetType) {
        this(targetType, new ObjectMapper());
        this.objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
        this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

JsonDeserializer不是为默认构造函数实例化而设计的,因为它需要知道要反序列化的targetType

您可以将此类扩展到特定类型:

public class FooJsonDeserializer extends JsonDeserializer<Foo> { }

并已将其用作值反序列化器属性的类值。

或者您可以考虑自定义DefaultKafka消费者工厂

@Bean
public ConsumerFactory<?, ?> kafkaConsumerFactory(KafkaProperties properties) {
    Map<String, Object> consumerProperties = properties.buildConsumerProperties();
    consumerProperties.put(CommonClientConfigs.METRIC_REPORTER_CLASSES_CONFIG,
            MyConsumerMetricsReporter.class);
    DefaultKafkaConsumerFactory<Object, Object> consumerFactory =
          new DefaultKafkaConsumerFactory<>(consumerProperties);
    consumerFactory.setValueDeserializer(new JsonDeserializer<>(Foo.class));
    return consumerFactory;
}
 类似资料:
  • 4.1 根据条件的自动配置 @conditional是基于条件的自动配置,一般配合Condition接口一起使用,只有接口实现类返回true,才装配,否则不装配. 用实现了Condition接口的类传入@Conditional中 @Conditional可以标记在配置类的方法中,也可以标记在配置类上.标记的位置不同,作用域不同. @Conditional可以传入多个实现了condition接口的类

  • 在我的spring boot 2应用程序中,我有一个应用程序。yml as, 我的配置类是, 代码在本地计算机中运行良好,所有值都按预期加载。但cloud env Consor将yml文件序列化为环境变量,因此我的配置表示为, 这是一个字符串。我不知道Consor以何种格式表示/序列化值。现在我的DefaultRateLimitsConfig无法加载,因为它会出错, 如何以更干净的方式在两个环境中

  • 我的spring boot项目不需要datasource配置,但当我运行它时,出现了错误: 申请启动失败 描述:配置数据源失败:未指定“url”属性,无法配置嵌入式数据源。 原因:无法确定合适的驱动程序类别 行动: 考虑以下内容:如果您想要一个嵌入式数据库(H2、HSQL或Derby),请将其放在类路径上。如果您有要从特定配置文件加载的数据库设置,您可能需要激活它(当前没有活动的配置文件) 我的a

  • 我有一个Spring Boot应用程序,它有一些配置属性。我正在尝试为一些组件编写测试,并希望从< code>test.properties文件中加载配置属性。我不能让它工作。 这是我的代码: 文件(在src/test/resources下): 配置属性类: 我的测试: 测试失败,并显示“预期实际不为空”,这意味着未设置配置属性类中的属性。

  • 我正在尝试从YML加载配置。如果这些是逗号分隔的值,我可以加载值,也可以加载列表。但我无法加载典型的YML列表。 配置类 工作路线。yml 不工作。yml 为什么我不能加载yml的第二个版本/我有一个语法错误? 环境:科特林,Spring2.0.0。M3

  • 我可以动态刷新Spring Boot的自动配置设置所使用的属性吗? 例如,我设置了以下属性(通过云配置)来自动配置: 现在,如果我更改配置服务器上的密码道具,并命中终结点,我可以看到已检索到更新的道具,但没有刷新。 我知道我可以手动配置bean,并确保它们属于,但我希望找到一种方法将自动配置的属性标记为“可刷新”。我有一些用例,我想刷新Spring Boot为数据源之外的其他bean使用的道具,手