Когда вы используете Lombok's @AllArgsConstructor
, он должен создать конструктор для всех ваших полей, помеченных @Value
, а тех, которые нет.
Теперь Ломбок даже ничего не знает о @Value
аннотации весны. Таким образом, сгенерированный конструктор выглядит примерно так:
public AdServiceImpl(AdRepository repository, FileService fileService, Integer DEFAULT_PageSize, String AD_IMAGE_PATH, String AD_IMAGE_URL) {
this.repository = repository;
....
}
Вы можете запустить Delombok, чтобы увидеть фактически сгенерированный код.
Spring, с другой стороны, когда видит, что один конструктор пытается вызвать егов этом случае создайте bean-компонент (AdServiceImpl
), и только после этого перебирает его поля и вводит данные, аннотированные @Value
.
Теперь, когда Spring вызывает конструктор, онвидит целое число (DEFAULT_PageSize), не имеет ни малейшего представления о том, что это значение (а пружина должна что-то ввести, потому что это инъекция конструктора), и выдает исключение
Итак, с точки зрения разрешения:
В этом случае не используйте конструктор всех аргументов lombok, а вместо этого создайте конструктор не-lombok только для AdRepository
и FileService
)
В качестве альтернативы создайте конструктор с аннотированными параметрами @Value вместо внедрения поля (удалите @Value для полей):
public AdServiceImpl(AdRepository repository, FileService fileService, @Value(${app.ad.DefaultPageSize}"} Integer DEFAULT_PageSize, @Value(...) String AD_IMAGE_PATH, @Value(...) String AD_IMAGE_URL) {
this.repository = repository;
....
}