これは、ポストバックで 1 つのビューから別のビューに移動している場合に発生します。ビュー スコープの 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");
}
}
これはかなりハックであることに注意してください。具体的な機能要件によっては、より良い解決策があるかもしれません。また、ビューでは目的の Bean インスタンスを asではなくasとしてnota
参照する必要があることに注意してください。これは、前に説明した理由により、新しい別のインスタンスが得られるためです。Attivita
#{nota.attivita}
#{attivita}