[prev in list] [next in list] [prev in thread] [next in thread] 

List:       tapestry-user
Subject:    Circular dependencies in Tap5 IOC raise StackOverflow Error - Concrete classes
From:       Michel Jeanson <kikih () jubii ! fr>
Date:       2008-08-31 22:07:40
Message-ID: loom.20080831T215705-879 () post ! gmane ! org
[Download RAW message or body]


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: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic