首先,由于可能的原因,不要在接口上选择抽象类:
没有具体的子类实现,就不能实例化抽象类。 它们不会在运行时被Spring注册为组件。
Spring不支持抽象类中的构造方法注入。 但是,有两种选择:
具体子类中的构造函数注入。
在一个抽象类中的Setter注入。
现在,您可以采用其他解决方案:
您具有与Operation相同名称的接口和类。 请删除它。
第一种方法:删除抽象类并直接实现接口。
将代码更新为此:
public interface Operation {
public GenericClientResponse validateCustomerId();
}
@Component
public class OperationImpl implements Operation {
@Autowired
UserAccountsRepository userAccountsRepository;
@Autowired
WebClient.Builder webClientBuilder;
public GenericClientRequest buildClientValidationRequest() {
return new GenericClientRequest();
}
public GenericClientResponse validateCustomerId() {
// code
}
}
第二种方法:尝试在具体的子类中使用构造函数注入。
public interface Operation {
public GenericClientResponse validateCustomerId();
}
public abstract class AbstractOperation implements Operation {
UserAccountsRepository userAccountsRepository;
WebClient.Builder webClientBuilder;
public AbstractOperation(UserAccountsRepository userAccountsRepository, WebClient.Builder webClientBuilder) {
this.userAccountsRepository = userAccountsRepository;
this.webClientBuilder = webClientBuilder;
}
public GenericClientRequest buildClientValidationRequest() {
return new GenericClientRequest();
}
public GenericClientResponse validateCustomerId() {
// code
}
}
@Component
public class OperationImpl extends AbstractOperation {
@Autowired
public OperationImpl(UserAccountsRepository userAccountsRepository, WebClient.Builder webClientBuilder) {
super(userAccountsRepository, webClientBuilder);
}
}
第三种方法:尝试在抽象类中使用setter-injection。
public interface Operation {
public GenericClientResponse validateCustomerId();
}
public abstract class AbstractOperation implements Operation {
UserAccountsRepository userAccountsRepository;
WebClient.Builder webClientBuilder;
@Autowired
public final void setUserAccountsRepository(UserAccountsRepository userAccountsRepository) {
this.userAccountsRepository = userAccountsRepository;
}
@Autowired
public final void setWebClientBuilder(LogRepository webClientBuilder) {
this.webClientBuilder = webClientBuilder;
}
public GenericClientRequest buildClientValidationRequest() {
return new GenericClientRequest();
}
public GenericClientResponse validateCustomerId() {
// code
}
}
@Component
public class OperationImpl extends AbstractOperation {
public void someMethod() {
userAccountsRepository.someRepositoryMethod();
}
}
希望这些信息对您有所帮助。
看到这里更多。