2011-08-22 94 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)這種行爲? –