如何使用构造函数注入

How to use constructor injection

我想编辑此代码以使用构造函数 Autowired

旧代码:

@RestController
public abstract class AbstractAccountController<T> {

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

child class:

@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
}

child class:

@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'

你知道什么是最好的解决方案吗?

AbstractAccount 控制器在您的代码中没有构造函数。请将构造函数名称更改为 AbstractAccountController。如果是打字错误,请不要介意。您也可以简单地将 final 添加到全局变量。

当您扩展 Abstract class 时,您可以通过简单地调用 super

将依赖参数传递给 abstract class
private final ServiceA serviceA;
public Constructor(ServiceA serviceA){
   super(serviceA);
}

错误是因为 child 没有显式调用 parent 构造函数,因此假设应该使用默认构造函数,但实际上并不存在。

确保从 child:

调用超级构造函数
@Autowired
public AccountController(Service1 service1, Service2 service2, Service3 service3, Service4 service4) {
  super(service1, service2);
  this.service3 = service3;
  this.service4 = service4;
}