Как использовать внедрение конструктора

Я хочу отредактировать этот код, чтобы использовать конструктор Autowired.

Старый код:

@RestController
public abstract class AbstractAccountController<T> {

    @Autowired
    private Service1 service1;
    @Autowired
    private Service2 service2;
    @Autowired
    private Service3 service3;
    
    ...some Java methods
}

дочерний класс:

@RestController
public class AccountController extends AbstractAccountController<SomeResource> {

  @Autowired
  private Service4 service4;
  @Autowired
  private Service5 service5;

..... some Java methods
}

Я попытался отредактировать код следующим образом:

@RestController
public abstract class AbstractAccountController<T> {

    private Service1 service1;
    private Service2 service2;
    private Service3 service3;

    @Autowired
    public AccountController(Service1 service1, Service2 service2) {
      this.service1 = service1;
      this.service2 = service2;
    }
    
    ...some Java methods
}

дочерний класс:

@RestController
public class AccountController extends AbstractAccountController<SomeResource> {

    private Service3 service3;
    private Service4 service4;
    private Service3 service3;

    @Autowired
    public AccountController(Service3 service3, Service4 service4) {
      this.service3 = service3;
      this.service4 = service4;
    }

    ..... some Java methods
}

Но я получаю сообщение об ошибке:

There is no default constructor available in 'com.test.controller.AbstractAccountController'

Знаете ли вы, что было бы лучшим решением?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Контроллер AbstractAccount не имеет конструктора в вашем коде. Измените имя конструктора на AbstractAccountController. Если это опечатка, не обращайте внимания. Также вы можете просто добавить final к глобальным переменным.

Когда вы расширяете абстрактный класс, вы можете передать параметры зависимости в абстрактный класс, просто вызвав super

private final ServiceA serviceA;
public Constructor(ServiceA serviceA){
   super(serviceA);
}

можете ли вы показать мне пример кода, пожалуйста?

Peter Penzov 22.03.2022 18:21
Ответ принят как подходящий

Ошибка заключается в том, что дочерний элемент явно не вызывает родительский конструктор, поэтому предполагается, что должен использоваться конструктор по умолчанию, но его не существует.

Убедитесь, что вы вызываете свой суперконструктор из дочернего элемента:

@Autowired
public AccountController(Service1 service1, Service2 service2, Service3 service3, Service4 service4) {
  super(service1, service2);
  this.service3 = service3;
  this.service4 = service4;
}

Другие вопросы по теме

Я использую платформу Java Spring для сопоставления данных из части моих данных, и моя переменная пути не даст мне доступа к каким-либо данным
Как я могу получить сегодня предметы с JPQL
Он возвращает ноль из моего репозитория с UUID, первичный идентификатор
Включен ли RestTemplate по умолчанию https
Как получить один экземпляр зависимости, в то время как он внедряется несколько раз в разные классы?
Существуют встроенные таблицы, созданные пакетным заданием spring в H2, такие как job_instance и т. д. Как мы можем добавить префикс к этим таблицам, используя файл свойств?
Найдено 0 интерфейсов репозитория JPA после того, как я запустил свое весеннее загрузочное приложение
Передача набора идентификаторов или набора объектов в качестве данных в DTO в Spring Boot?
Spring 5: может ли ChainFileListFilter обрабатывать файлы в указанном порядке сортировки?
Как получить список файлов после операции mput в исходящем шлюзе ftp?