(De-)Serializing Spring Boot ConfigurationProperties with Jackson

(De-)Serializing Spring Boot ConfigurationProperties with Jackson

我的 spring 引导应用程序使用 class 注释 @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 来(反)序列化此配置 class?

出于测试目的删除注释 @Configuration@ConfigurationProperties 时,序列化工作正常。所以这似乎与 class 是一个豆子有关?

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