Ciò accade se si sta navigando da uno all'altro vista su un postback . Un bean con scope vista non è legato a una richiesta, ma a una vista. Pertanto, quando si passa a una nuova vista, si otterrà una nuova istanza del bean con ambito di visualizzazione. Non riutilizzerà la stessa istanza di bean associata a una vista precedente.
Capisco che il bean attivita
venga creato nella vista iniziale e riutilizzato nel postback. Capisco che il bean nota
sia associato alla nuova vista alla quale stai navigando. Quando si inietta attivita
in esso, otterrà semplicemente un'istanza nuova e distinta anche se c'è un'altra istanza nella stessa richiesta. Tutto ciò è previsto (e, ammettiamolo, un po 'non intuitivo) comportamento.
Non esiste una soluzione JSF standard per questo. CDI risolve questo problema con @ConversationScoped
(il bean vive finché glielo dici esplicitamente di vivere) e l'estensione CDI MyFaces CODI va un po 'oltre con @ViewAccessScoped
(il bean vive finché la vista navigata lo fa riferimento).
È tuttavia possibile aggirare il problema memorizzando il bean come attributo nell'ambito della richiesta.
@ManagedBean
@ViewScoped
public class Attivita implements Serializable {
public String submit() {
FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap().put("attivita", this);
return "nota";
}
}
e
@ManagedBean
@ViewScoped
public class Nota implements Serializable {
private Attivita attivita;
@PostConstruct
public void init() {
attivita = (Attivita) FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap().get("attivita");
}
}
Si noti che questo è piuttosto hacky. Potrebbero esserci soluzioni migliori a seconda del requisito funzionale concreto. Si noti inoltre che nella vista nota
fare riferimento all'istanza del bean Attivita
desiderata come #{nota.attivita}
e non come #{attivita}
, perché fornirebbe un'istanza nuova e diversa, per i motivi già illustrati in precedenza.
Fare attenzione a contrassegnare le risposte corrette.L'overflow dello stack non riguarda solo le domande, ma anche le risposte. –