【问题标题】:(De-)Serializing Spring Boot ConfigurationProperties with Jackson(反)使用 Jackson 序列化 Spring Boot ConfigurationProperties
【发布时间】:2021-03-31 09:30:59
【问题描述】:

我的 Spring Boot 应用程序使用了一个用 @Configuration@ConfigurationProperties 注释的类:

@Configuration
@ConfigurationProperties(prefix = "my")
@Getter
@Setter
public class MyConfigurationProperties {

    @Value("${timeout}")
    private int defaultTimeout;
}

现在我想使用(私有)REST 接口读取和更新这些配置属性,因此我创建了以下控制器。

@RestController
@RequestMapping(path = "config")
public class ConfigController {

    final MyConfigurationProperties myConfig;

    public ConfigController(MyConfigurationProperties myConfig) {
        this.myConfig = myConfig;
    }

    @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<MyConfigurationProperties> get() {
        return ResponseEntity.ok(myConfig);
    }
}

不幸的是,这似乎不起作用,因为我在调用端点时遇到以下异常:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.springframework.context.expression.StandardBeanExpressionResolver and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

禁用FAIL_ON_EMPTY_BEANS 时,JSON 响应甚至包含“奇怪”属性:

如何使用 Jackson 来(反)序列化这个配置类?

当出于测试目的删除注释@Configuration@ConfigurationProperties 时,序列化工作正常。所以它似乎必须与作为 bean 的类有关?

【问题讨论】:

  • 那个类有getter和setter吗?我确实看到了注释,但请确保在您的项目中启用了 lombok
  • 是的,可以使用 getter 和 setter。龙目岛已启用。如果删除 @Configuration 注释,序列化工作正常,但这不会满足我的用例。

标签: spring spring-boot jackson


【解决方案1】:

您正在混合:配置属性和自动装配值。如果您想将 POJO 作为配置属性类,请删除 @Value 注释。如果您将@EnableConfigurationProperties 添加到您的主类中,您也可以删除@Configuration 注释(这样所有@ConfigurationProperties 类都将被自动检测到)。如果问题仍然存在,请更新问题并向我们展示以“my”为前缀的属性的外观。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 2021-02-18
    • 2015-08-07
    • 2023-04-02
    • 2017-08-10
    相关资源
    最近更新 更多