I have spent a bit of time looking into this one.
I have a set of services that use annotations for components.
A bunch of them use ActiveObjects.
The services work great in a unit-test environment. In that instance I have a memory-based ActiveObjects that is used.
However, when trying to use 'atlas-run' I run into an issue.
I get the following error.
INFO] [talledLocalContainer] org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'predicateService': Unsatisfied dependency expressed through constructor argument with index 0 of type [com.atlassian.activeobjects.external.ActiveObjects]: : No qualifying bean of type [com.atlassian.activeobjects.external.ActiveObjects] is defined: expected single matching bean but found 2: ao_osgi,activeObjects; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.atlassian.activeobjects.external.ActiveObjects] is defined: expected single matching bean but found 2: ao_osgi,activeObjects
The code I have now looks like this (I added @Scan just now, to no avail.
@Scanned
@Component
@ExportAsService({PredicateService.class})
@Named("predicateService")
public class PredicateServiceImpl implements PredicateService {
Logger.Log log = Logger.getInstance(PredicateServiceImpl.class);
@ComponentImport
private final ActiveObjects ao;
@Inject
public PredicateServiceImpl(ActiveObjects ao) {
this.ao = ao;
}
I have read about similar situations encountered in Spring in general, tried a few things, nothing seemed to work.
Any advice, admonitions etc are appreciated!
I swapped @ComponentImport with @Qualifier (the one that takes a value), and things seem happier.
I removed @Scanned as well.
Is this correct form?
Do others encounter the need for @Qualifier sometimes?
@Component
@ExportAsService({PredicateService.class})
@Named("predicateService")
public class PredicateServiceImpl implements PredicateService {
Logger.Log log = Logger.getInstance(PredicateServiceImpl.class);
@Qualifier("activeObjects")
private final ActiveObjects ao;
@Inject
public PredicateServiceImpl(ActiveObjects ao) {
this.ao = ao;
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.