【问题标题】:Two instantiations of the managed-bean托管 bean 的两个实例化
【发布时间】:2011-08-22 12:53:01
【问题描述】:

当我第一次访问我的页面时,页面使用的托管 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 实例化两次?

感谢您的想法...

使用

  • jsf 1.2
  • richfaces 3.3.2.SR1

编辑: 感谢Joeri Hendrickx,我发现我有两个不同的请求。所以新的问题是“为什么我在访问我的页面时有两个请求?”

【问题讨论】:

  • 由于您的 bean 是请求范围的,因此不应如此。你说你有两次相同的堆栈跟踪;检查Request对象是否相同。
  • 你说得对,其实不是同一个请求。说明:在此过程中,我通过了两个过滤器(一个过滤器使用 Waffle,另一个调用 Web 服务...)。
  • @Joeri:你应该重新发布它作为答案,它实际上是两个物理上不同的请求。
  • @BalusC 当然,但我现在问我“为什么我访问我的页面时有两个请求?”。问题刚刚改变。
  • 这不是 JSF 问题。只需安装一个 HTTP 流量调试器,如 Fiddler2。我猜你是在使用 Eclipse 和 Tomcat 或 JBoss 并且在服务器完成启动之前触发了第一个请求?

标签: jsf managed-bean ajax4jsf


【解决方案1】:

如果您获得两个请求范围 bean 的实例,这应该意味着您有两个请求。

检查您的浏览器是否发送了两个请求(使用 firebug 或 fiddler)。如果它只发送一个,这意味着您的请求在堆栈中的某处重复(可能在过滤器中,甚至可能在自定义 servlet 中)。

【讨论】:

  • 要结束这个故事,我找不到为什么会有两个请求。可以由jsf进程制作。因为它似乎并不令人不安,所以我离开了这个问题。但是,这是我第一次看到这种行为是 jsf。谢谢
  • @Jean-Charles 如果您使用的是完整的开源堆栈(我会假设这一点),您应该能够完全跟踪请求的来源。如果它真的是来自您的服务器(tomcat?)的两个单独的请求对象,那么它必须是两个请求,您至少应该在 Fiddler 中看到它。如果你有合适的工具,没有问题是不可调试的:)
  • 是的,我同意这一点;)但我问我这是否真的是一个错误。全局行为似乎是好的(例如,保持活力可以正常工作)。你有没有在你的应用程序中看到过这种行为(两个实例)?
  • 否;我经常看到多次访问,但从来没有多次实例。
  • 即使问题仍然存在,我也接受你的回答,因为你帮助我以正确的方式看待......谢谢
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 2013-09-06
  • 2015-06-15
  • 1970-01-01
  • 2012-11-08
  • 2012-06-03
  • 2016-10-24
  • 2021-05-24
相关资源
最近更新 更多