Ambigous with annotation binding

View: New views
1 Messages — Rating Filter:   Alert me  

Ambigous with annotation binding

by jduss :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi guys!

I just implemented testcase which doesn't work as I expected according to patches-for-*full*-binding-annotation-capability post.

I think it is quite standart situation but I couldn find any solution :(

Could anyone to say how to create HumanService class?

Regards

--------------------------------------------------------------------------------------
package com.company.performance.pico;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.picocontainer.BindKey;
import org.picocontainer.DefaultPicoContainer;
import org.picocontainer.annotations.Bind;
import org.picocontainer.injectors.SetterInjection;

import junit.framework.TestCase;

public class AmbiguousDependencyTestCase extends TestCase {
   
    @Retention(RetentionPolicy.RUNTIME)
    @Target( { ElementType.FIELD, ElementType.PARAMETER })
    @Bind
    public static @interface FirstService {
    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target( { ElementType.FIELD, ElementType.PARAMETER })
    @Bind
    public static @interface SecondService {
    }
   
    public static interface Service {
        void start();
    }
   
    public static  abstract class SuperService implements Service {
       
        private Service firstService;
        private Service secondService;
       
        public Service getFirstService() {
            return firstService;
        }
       
        public void setFirstService(@FirstService Service firstService) {
            this.firstService = firstService;
        }
       
        public Service getSecondService() {
            return secondService;
        }
       
        public void setSecondService(@SecondService Service secondService) {
            this.secondService = secondService;
        }
       
        public void start() {
            System.out.println(this.getClass().getCanonicalName());
        }
    }
   
       
    public static class RightService extends SuperService {
       
    }
   
    public static class LeftService extends SuperService {
       
    }
   
    public static class HumanService extends SuperService {
       
    }

    private DefaultPicoContainer mpc;
   
    public void testRussianDollAnnotationInjection() {
        mpc = new DefaultPicoContainer(new SetterInjection());
        mpc.addComponent(HumanService.class);
        mpc.addComponent(BindKey.bindKey(Service.class, FirstService.class), RightService.class);
        mpc.addComponent(BindKey.bindKey(Service.class, SecondService.class), LeftService.class);
        HumanService humanService = mpc.getComponent(HumanService.class);
        assertNotNull(humanService);
        assertNotNull(humanService.getFirstService());
        assertNotNull(humanService.getSecondService());
        assertTrue(humanService.getFirstService() instanceof RightService);
        assertTrue(humanService.getSecondService() instanceof LeftService);
    }
}

--------------------------------------------------------------------------------------
Stack Trace:

org.picocontainer.injectors.AbstractInjector$AmbiguousComponentResolutionException: <no-component> needs a 'com.company.performance.pico.AmbiguousDependencyTestCase$Service' injected, but there are too many choices to inject. These:[class com.company.performance.pico.AmbiguousDependencyTestCase$HumanService, class com.company.performance.pico.AmbiguousDependencyTestCase$LeftService], refer http://picocontainer.org/ambiguous-injectable-help.html
        at org.picocontainer.parameters.BasicComponentParameter.tooManyMatchingAdaptersFound(BasicComponentParameter.java:330)
        at org.picocontainer.parameters.BasicComponentParameter.findTargetAdapter(BasicComponentParameter.java:308)
        at org.picocontainer.parameters.BasicComponentParameter.getTargetAdapter(BasicComponentParameter.java:282)
        at org.picocontainer.parameters.BasicComponentParameter.resolveAdapter(BasicComponentParameter.java:255)
        at org.picocontainer.parameters.BasicComponentParameter.resolve(BasicComponentParameter.java:173)
        at org.picocontainer.parameters.ComponentParameter.access$001(ComponentParameter.java:39)
        at org.picocontainer.parameters.ComponentParameter$1.<init>(ComponentParameter.java:120)
        at org.picocontainer.parameters.ComponentParameter.resolve(ComponentParameter.java:119)
        at org.picocontainer.injectors.IterativeInjector.matchParameter(IterativeInjector.java:115)
        at org.picocontainer.injectors.IterativeInjector.matchParameters(IterativeInjector.java:106)
        at org.picocontainer.injectors.IterativeInjector.getMatchingParameterListForSetters(IterativeInjector.java:87)
        at org.picocontainer.injectors.IterativeInjector.access$000(IterativeInjector.java:34)
        at org.picocontainer.injectors.IterativeInjector$2.run(IterativeInjector.java:142)
        at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:289)
        at org.picocontainer.injectors.IterativeInjector.getComponentInstance(IterativeInjector.java:149)
        at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:615)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:583)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:570)
        at org.picocontainer.parameters.BasicComponentParameter$10.resolveInstance(BasicComponentParameter.java:190)
        at org.picocontainer.parameters.ComponentParameter$1.resolveInstance(ComponentParameter.java:136)
        at org.picocontainer.injectors.IterativeInjector.decorateComponentInstance(IterativeInjector.java:160)
        at org.picocontainer.injectors.IterativeInjector.access$200(IterativeInjector.java:34)
        at org.picocontainer.injectors.IterativeInjector$2.run(IterativeInjector.java:144)
        at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:289)
        at org.picocontainer.injectors.IterativeInjector.getComponentInstance(IterativeInjector.java:149)
        at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:615)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:580)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:588)
        at com.company.performance.pico.AmbiguousDependencyTestCase.testRussianDollAnnotationInjection(AmbiguousDependencyTestCase.java:79)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at junit.framework.TestCase.runTest(TestCase.java:154)
        at junit.framework.TestCase.runBare(TestCase.java:127)
        at junit.framework.TestResult$1.protect(TestResult.java:106)
        at junit.framework.TestResult.runProtected(TestResult.java:124)
        at junit.framework.TestResult.run(TestResult.java:109)
        at junit.framework.TestCase.run(TestCase.java:118)
        at junit.framework.TestSuite.runTest(TestSuite.java:208)
        at junit.framework.TestSuite.run(TestSuite.java:203)
        at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
--------------------------------------------------------------------------------------