這樣如果你從一個導航到另一個視圖上回發發生。視圖範圍的bean不綁定到請求,而是綁定到視圖。因此,當您導航到新視圖時,它將獲得視圖範圍bean的全新實例。它不會重用與先前視圖關聯的同一個bean實例。
據我所知,attivita
bean是在初始視圖上創建的,並在回發時重用。我知道nota
bean與您要導航到的新視圖關聯。當在其中注入attivita
時,即使同一請求中有另一個實例,它也會簡單地獲得一個新的獨立實例。這是所有的預期(並承認有點不直觀)的行爲。
對此沒有標準的JSF解決方案。 CDI通過@ConversationScoped
解決了這個問題(只要你明確地告訴它活着,bean就會生存)並且CDI擴展MyFaces CODI進一步跟@ViewAccessScoped
(bean只要導航視圖引用它一直存在)進一步相關。
然而,您可以通過將bean作爲屬性存儲在請求範圍中來解決此問題。
@ManagedBean
@ViewScoped
public class Attivita implements Serializable {
public String submit() {
FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap().put("attivita", this);
return "nota";
}
}
和
@ManagedBean
@ViewScoped
public class Nota implements Serializable {
private Attivita attivita;
@PostConstruct
public void init() {
attivita = (Attivita) FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap().get("attivita");
}
}
請注意,這是相當哈克。取決於具體的功能要求,可能會有更好的解決方案。還請注意,您應該在nota
視圖中將期望的Attivita
bean實例指定爲#{nota.attivita}
和而不是作爲#{attivita}
,因爲由於前面已解釋的原因,它會爲您提供新的不同實例。
注意標記正確的答案。堆棧溢出不僅僅是關於答案的問題。 –