使用wicket-guice时的无限循环

时间:2012-02-03 13:16:43

标签: java wicket guice

我现在使用wicket几个月了,最近我开始躲避wicket-guice。 所以我是一个非常好的noobie:)

每个页面都有一个ServiceClass(让我们称之为DoService),它管理着许多对象(即用户)...... 由于某些原因,这些对象也引用了该ServiceClass。

public class page ... {
  @Inject
  private DoService doService;
}

public class DoService ... {
  private Collection<User> ... 
}

public class User {
   @Inject
   private DoService doService;
}

我不太确定,但我认为以下异常会导致依赖的循环引用,但我认为guice会自己管理这一切。

无论如何.....如果您需要更多信息来了解我的问题请问:)

提前致谢

java.lang.StackOverflowError
     at java.lang.reflect.InvocationTargetException.<init>(InvocationTargetException.java:54)
     at WICKET_....DoService$$FastClassByCGLIB$$ce256f9.invoke(<generated>)
     at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
     at org.apache.wicket.proxy.LazyInitProxyFactory$CGLibInterceptor.intercept(LazyInitProxyFactory.java:317)
     at WICKET_....DoService$$EnhancerByCGLIB$$d1f8934e.rollback(<generated>)
     at WICKET_c....DoService$$FastClassByCGLIB$$ce256f9.invoke(<generated>)
     at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
......

2 个答案:

答案 0 :(得分:2)

我认为您的设计不正确:域对象不应包含对服务的引用。你确实有一个循环依赖。

答案 1 :(得分:0)

Guice在这里做的是为每个DoService实例创建一个新的User实例,为每个User实例创建一个新的DoService实例。我不认为你想在这里存档(除了有问题的设计)。 有几种方法可以解决这个问题:

  1. 在您的模块中使用适当的提供商
  2. 在guice中使用单一作用域
  3. 仅对其中一个实例使用guice。让一个对象创建另一个对象并将其自身提供给另一个构造函数以供反向引用。