I want to inject a service into another generic service.
I have an abstract class ApplicationAccessor:
@Component
public abstract class ApplicationAccessor {
@Autowired
protected ApplicationRepository applicationRepository;
@Autowired
protected ApplicationTypeRepository applicationTypeRepository;
public abstract List<ApplicationTypeEntity> getAllApplicationsTypes();
public abstract List<ApplicationEntity> getAllApplications();
}
Which is extended by two Application Accessors:
@Component
public class DefaultApplicationAccessor extends ApplicationAccessor {
@Override
public List<ApplicationTypeEntity> getAllApplicationsTypes() {
return this.applicationTypeRepository.findAllNonRemoteWorkApplicationTypes();
}
@Override
public List<ApplicationEntity> getAllApplications() {
return this.applicationRepository.findAllNonRemoteWorkApplications();
}
}
And RemoteWorkApplicationAccessor which is very similar to the one above.
I also have ApplicationService which is generically dependent on ApplicationAccessor
@Service
public class ApplicationServiceImpl<T extends ApplicationAccessor> implements ApplicationService<T> { }
And ApplicationService (interface that implements ApplicationServiceImpl):
public interface ApplicationService<T extends ApplicationAccessor> { }
In ApplicationServiceImpl I want to have a generic property with type T being ApplicationAccessor which is autowired:
@Autowired
private T applicationAccessor;
Then in the controller I want to inject generic ApplicationService:
@Autowired
private ApplicationService<DefaultApplicationAccessor> applicationService;
But unfortunately I get an error:
Parameter 0 of constructor in ApplicationServiceImpl required a single bean, but 2 were found:
- defaultApplicationAccessor: defined in file [...]
- remoteWorkApplicationAccessor: defined in file [...]
What can I do to fix it?