2011-08-22 81 views
1

当我第一次访问我的页面时,页面使用的托管bean是instanciate两次(我在构造器中传递了两次,具有相同的堆栈跟踪):JSF - 托管bean的两个实例

Daemon Thread [http-127.0.0.1-8080-1] (Suspended (breakpoint at line 76 in MyController)) 
    MyController.<init>() line: 76 
    NativeConstructorAccessorImpl.newInstance0(Constructor, Object[]) line: not available [native method] 
    NativeConstructorAccessorImpl.newInstance(Object[]) line: 39  
    DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 27  
    Constructor<T>.newInstance(Object...) line: 513 
    Class<T>.newInstance0() line: 355 
    Class<T>.newInstance() line: 308  
    ManagedBeanBuilder(BeanBuilder).newBeanInstance() line: 186 
    ... 
    pass throught two Filters (one of the filter uses Waffle and the other calls a web service...) 
    ...  
    Http11Protocol$Http11ConnectionHandler.process(Socket) line: 601  
    JIoEndpoint$Worker.run() line: 447 
    Thread.run() line: 662 

在XHTML:

<a4j:keepAlive beanName="myController"></a4j:keepAlive> 
<h:form> 
... 
</h:form> 

在faces-config.xml中:

<managed-bean> 
     <managed-bean-name>myController</managed-bean-name> 
     <managed-bean-class>com.xx.MyController</managed-bean-class> 
     <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

为什么托管bean我s instanciate两次?

感谢您的想法...

使用

  • JSF 1.2
  • RichFaces的3.3.2.SR1

编辑: 感谢Joeri亨德里克斯,我发现我有两个不同的要求。所以新的问题是“为什么当我访问我的页面时有两个请求?”

+2

由于您的bean是请求范围的,所以不应该如此。你说你有两次相同的堆栈跟踪;检查Request对象是否相同。 –

+0

你说得对,其实这不是同一个要求。指示:在此过程中,我通过两个过滤器(其中一个过滤器使用Waffle,另一个过滤器调用Web服务...)。 –

+0

@Joeri:你应该重新发布这个答案,它实际上是两个物理上不同的请求。 – BalusC

回答

2

如果您得到两个请求范围bean的实例,那应该表示您有两个请求。

检查您的浏览器是否发出两个请求(使用萤火虫或小提琴手)。如果它只发出一个,这意味着你的请求被复制到堆栈的某个地方(可能在过滤器中,或者甚至可能在一个自定义的servlet中)。

+0

为了结束这个故事,我找不到为什么有两个请求。可以由jsf进程制作。因为它似乎并不令人不安,我离开这个问题。不过,这是我第一次看到这种行为是jsf。谢谢 –

+0

@ Jean-Charles如果你正在使用一个完整的开源堆栈(我将假设这个),你应该能够完全追踪它的来源。如果真的有两个独立的请求对象从你的服务器(tomcat?)进入,那么它必须是两个请求,你至少应该在Fiddler中看到这个。如果你有合适的工具,没有问题的是undebuggable :) –

+0

是的,当然,我同意这一点;)但我问我是否真的是一个错误。全球行为似乎是好事(例如保持活力)。你有没有看到你的应用程序(两个instanciations)这种行为? –