Spring Boot Не удалось использовать @Value для инъекций - PullRequest
0 голосов
/ 09 ноября 2019

Версия Spring Boot <version>2.2.0.RELEASE</version>

Ошибка выглядит следующим образом:

Описание:

Параметру 2 конструктора в com.shawn.foodrating.service.impl.AdServiceImpl требуется компонент типаjava.lang.Integer, который не может быть найден.

Действие:

Рассмотрите возможность определения bean-компонента типа 'java.lang.Integer' в вашей конфигурации.

MyКод:

@Service
@Transactional(rollbackOn = Exception.class)
@AllArgsConstructor
public class AdServiceImpl implements AdService {
 private AdRepository repository;
 private FileService fileService;
 @Value("${app.ad.DefaultPageSize}")
 private Integer DEFAULT_PageSize;
 @Value("${app.ad.ImagePath}")
 private String AD_IMAGE_PATH;
 @Value("${app.ad.ImageUrl}")
 private String AD_IMAGE_URL;

Загрузить файл свойств


@SpringBootApplication
@PropertySource("classpath:app.properties")
public class FoodRatingApplication {
    public static void main(String[] args) {
        SpringApplication.run(FoodRatingApplication.class, args);
    }

}

Не уверен, что с ним не так.

1 Ответ

1 голос
/ 09 ноября 2019

Когда вы используете 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;
   ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...