2012-10-22 22 views
5

我有一堆渴望ApplicationScoped託管的bean。其中一些注入到其他註釋中,形成一個依賴關係樹。每個依賴bean在構建後都會操縱其父項。Eager ApplicationScoped被管理的bean多次構建

但是,它似乎是爲每次注入創建一個新實例,因此使以前的操作撤消。據我瞭解,一個ApplicationScoped bean只能創建一次。我誤解了,或者爲什麼會發生這種情況?是因爲他們渴望嗎?

下面是一個例子:

ParentBean.java
package example; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 

@ManagedBean(eager = true) 
@ApplicationScoped 
public class ParentBean 
{ 
    static int initCount = 0; 

    // ... 

    @PostConstruct 
    public void init() 
    { 
     ++initCount; // Will end up being between 1 and 3. Expected always 1. 

     // ... 
    } 
} 

Child1Bean.java
package example; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 

@ManagedBean(eager = true) 
@ApplicationScoped 
public class Child1Bean 
{ 
    @ManagedProperty("#{parentBean}") ParentBean parentBean; 

    public ParentBean getParentBean() 
    { 
     return parentBean; 
    } 

    public void setParentBean(ParentBean parentBean) 
    { 
     this.parentBean = parentBean; 
    } 

    @PostConstruct 
    public void init() 
    { 
     // manipulate parentBean 
    } 
} 

Child2Bean.java
package example; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 

@ManagedBean(eager = true) 
@ApplicationScoped 
public class Child2Bean 
{ 
    @ManagedProperty("#{parentBean}") ParentBean parentBean; 

    public ParentBean getParentBean() 
    { 
     return parentBean; 
    } 

    public void setParentBean(ParentBean parentBean) 
    { 
     this.parentBean = parentBean; 
    } 

    @PostConstruct 
    public void init() 
    { 
     // manipulate parentBean 
    } 
} 
+2

你能給出一個你如何做的代碼示例嗎? –

+0

好的,我添加了一個例子。 – Spomf

+0

不要以爲我會做任何改變,但嘗試'@ManagedProperty(value =「#{parentBean}」)', – Daniel

回答

0

我有鑽嘴魚科2.0同樣的問題。X。我想這個問題與多線程JSF啓動有關。嘗試通過com.sun.faces.enableMultiThreadedStartup參數禁用它。

+0

謝謝,但它沒有效果。我的應用程序正在Mojarra 2.1.6上運行。 – Spomf

+0

你解決了嗎?我也有同樣的問題 –

1

我希望在Tomcat 8 + Mojarra 2.2.0上解決了這個問題。 在我來說,我只是刪除監聽聲明從web.xml中

<listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
</listener> 

構造似乎是一次事後調用。

關於聽衆條目,有一個關於this問題的BalusC答案的一部分。

在任何情況下,鑽嘴魚科的ConfigureListener的web.xml中顯式註冊實際上只需要要解決老馬車服務器,如GlassFish的第三版和Jetty誰沒有找到鑽嘴魚科的TLD文件中的監聽器。部署到體面的服務器時,整個條目是不必要的。

相關問題