(Де-) сериализация свойств конфигурации загрузки Spring с помощью Jackson

#spring #spring-boot #jackson

#spring #весенняя загрузка #джексон

Вопрос:

Мое приложение 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)

Ответ JSON даже содержит «странные» свойства при отключении FAIL_ON_EMPTY_BEANS :

Пример ответа JSON

Как я мог бы (де-) сериализовать этот класс конфигурации с помощью Jackson?

При удалении аннотаций @Configuration и @ConfigurationProperties в целях тестирования сериализация работает просто отлично. Так что, похоже, нужно что-то делать с классом, являющимся компонентом?

Комментарии:

1. есть ли у этого класса геттеры и сеттеры? я вижу аннотацию, но убедитесь, что lombok включен в вашем проекте

2. Да, доступны геттеры и сеттеры. Включен Lombok. Сериализация работает нормально, если @Configuration аннотации удалены, но это не соответствует моему варианту использования.

Ответ №1:

Вы смешиваете вещи: свойства конфигурации и автоматическое ввод значения. Если вы хотите иметь POJO в качестве класса свойств конфигурации, удалите @Value аннотацию. Вы также можете удалить @Configuration аннотацию, если добавляете @EnableConfigurationProperties ее в свой основной класс (таким образом, все @ConfigurationProperties классы будут обнаружены автоматически). Если проблема не устранена, пожалуйста, обновите вопрос и покажите нам, как выглядят свойства с префиксом «my».