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.