如何使用构造函数注入



我想编辑此代码以使用构造函数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'

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

错误是因为子构造函数没有显式调用父构造函数,所以假设应该使用默认构造函数,但不存在。

确保您从子级调用您的超级构造函数:

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

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

当您扩展抽象类时,您可以通过简单地调用超级将依赖参数传递给抽象类

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

最新更新