#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
:
Как я мог бы (де-) сериализовать этот класс конфигурации с помощью Jackson?
При удалении аннотаций @Configuration
и @ConfigurationProperties
в целях тестирования сериализация работает просто отлично. Так что, похоже, нужно что-то делать с классом, являющимся компонентом?
Комментарии:
1. есть ли у этого класса геттеры и сеттеры? я вижу аннотацию, но убедитесь, что lombok включен в вашем проекте
2. Да, доступны геттеры и сеттеры. Включен Lombok. Сериализация работает нормально, если
@Configuration
аннотации удалены, но это не соответствует моему варианту использования.
Ответ №1:
Вы смешиваете вещи: свойства конфигурации и автоматическое ввод значения. Если вы хотите иметь POJO в качестве класса свойств конфигурации, удалите @Value
аннотацию. Вы также можете удалить @Configuration
аннотацию, если добавляете @EnableConfigurationProperties
ее в свой основной класс (таким образом, все @ConfigurationProperties
классы будут обнаружены автоматически). Если проблема не устранена, пожалуйста, обновите вопрос и покажите нам, как выглядят свойства с префиксом «my».