I a new to T5 IOC (but not to HiveMind and Tap3, 4),
and I encounter issues with circular dependencies.

Here is my problem:

I have two classes A and B with mutual dependency :

public class A {

private B b;

public B getB() { return b; }

public void setB(B b) { this.b = b; }

}

public class B {

private A a;

public A getA() { return a; }

public void setA(A a) { this.a = a; }

}



I have built a module as follows:


        public static A buildA(@InjectService("b")B b) {
                A a = new A();
                a.setB(b);
                return a;
        }
        
        public static B buildB(@InjectService("a")A a) {
                B b = new B();
                b.setA(a);
                return b;
        }



And I get a StackOverflowError



Exception in thread "main" java.lang.StackOverflowError
        at java.util.regex.Pattern$6.isSatisfiedBy(Unknown Source)
        at java.util.regex.Pattern$6.isSatisfiedBy(Unknown Source)
        at java.util.regex.Pattern$CharProperty.match(Unknown Source)
        at java.util.regex.Pattern$GroupHead.match(Unknown Source)
        at java.util.regex.Pattern$Branch.match(Unknown Source)
        at java.util.regex.Pattern$Branch.match(Unknown Source)
        at java.util.regex.Pattern$Branch.match(Unknown Source)
        at java.util.regex.Pattern$BranchConn.match(Unknown Source)
        at java.util.regex.Pattern$GroupTail.match(Unknown Source)
        at java.util.regex.Pattern$Curly.match0(Unknown Source)
        at java.util.regex.Pattern$Curly.match(Unknown Source)
        at java.util.regex.Pattern$GroupHead.match(Unknown Source)
        at java.util.regex.Pattern$Branch.match(Unknown Source)
        at java.util.regex.Pattern$Branch.match(Unknown Source)
        at java.util.regex.Pattern$BmpCharProperty.match(Unknown Source)
        at java.util.regex.Pattern$Start.match(Unknown Source)
        at java.util.regex.Matcher.search(Unknown Source)
        at java.util.regex.Matcher.find(Unknown Source)
        at java.util.Formatter.parse(Unknown Source)
        at java.util.Formatter.format(Unknown Source)
        at java.util.Formatter.format(Unknown Source)
        at java.lang.String.format(Unknown Source)
        at org.apache.tapestry5.ioc.internal.util.
MessageFormatterImpl.format(MessageFormatterImpl.java:49)
        at org.apache.tapestry5.ioc.util.
AbstractMessages.format(AbstractMessages.java:103)
        at
org.apache.tapestry5.ioc.internal.
IOCMessages.creatingService(IOCMessages.java:127)
        at org.apache.tapestry5.ioc.internal.
ModuleImpl.create(ModuleImpl.java:195)
        at org.apache.tapestry5.ioc.internal.
ModuleImpl.findOrCreate(ModuleImpl.java:163)
        at org.apache.tapestry5.ioc.internal.
ModuleImpl.getService(ModuleImpl.java:91)
        at org.apache.tapestry5.ioc.internal.
RegistryImpl.getService(RegistryImpl.java:294)
        at
org.apache.tapestry5.ioc.internal.
ObjectLocatorImpl.getService(ObjectLocatorImpl.java:39)
        at
org.apache.tapestry5.ioc.internal.util.
InternalUtils.calculateParameterValue(InternalUtils.java:193)

        at
org.apache.tapestry5.ioc.internal.util.
InternalUtils.calculateParameters(InternalUtils.java:239)
        at
org.apache.tapestry5.ioc.internal.util.
InternalUtils.calculateParametersForMethod(InternalUtils.java:218)
        at
org.apache.tapestry5.ioc.internal.
ServiceBuilderMethodInvoker.createObject(ServiceBuilderMethodInvoker.java:67)
        at org.apache.tapestry5.ioc.internal.
ModuleImpl.create(ModuleImpl.java:212)
        at org.apache.tapestry5.ioc.internal.
ModuleImpl.findOrCreate(ModuleImpl.java:163)
        at org.apache.tapestry5.ioc.internal.
ModuleImpl.getService(ModuleImpl.java:91)
        at org.apache.tapestry5.ioc.internal.
RegistryImpl.getService(RegistryImpl.java:294)
        at
org.apache.tapestry5.ioc.internal.
ObjectLocatorImpl.getService(ObjectLocatorImpl.java:39)
        at
org.apache.tapestry5.ioc.internal.util.
InternalUtils.calculateParameterValue(InternalUtils.java:193)
        at
org.apache.tapestry5.ioc.internal.util.
InternalUtils.calculateParameters(InternalUtils.java:239)
        at
org.apache.tapestry5.ioc.internal.util.
InternalUtils.calculateParametersForMethod(InternalUtils.java:218)
        at
org.apache.tapestry5.ioc.internal.
ServiceBuilderMethodInvoker.createObject(ServiceBuilderMethodInvoker.java:67)
        at org.apache.tapestry5.ioc.internal.
ModuleImpl.create(ModuleImpl.java:212)
...
...
...


My question is: should this be considered a feature
that concrete classes do notallow circular dependencies
(BTW, if A and B are interfaces with AImpl and BImpl
some implementations, everything works fine).

And if this is intended, shoud this stay as it is?
Using concrete class only might not be perfect in terms
of theory, but it makes sense quite a few times...

Thanks in advance,

Michel.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to