私のアプリは、Facelets と mySql 5.5 SGBD にアクセスする従来の JSF 2.1 です。問題は次のとおりです。2 つの jsf ページで共有される「マネージド Bean」があります。人物を表示するページと編集するページ (JPA 人物クラス)。
したがって、「MB」で「SessionScoped」アノテーションを使用すると、ビジョンの人物インスタンスが編集と共有されます。ただし、アノテーションを MB の「viewScopped」に変更すると、「Person」インスタンスは共有されなくなります。
「viewScoped」アノテーションを使用してこれを回避するにはどうすればよいですか?
私のコードは次のようになります。
/**
* Control layer should be session ou view scopped?????
*/
@ManagedBean
@SessionScoped
public class ControllerPessoa implements Serializable {
private static final long serialVersionUID = 1L;
private Pessoa pessoa;
private DataModel model;
public ControllerPessoa() {
// Necessary to view(non-edit)
if (this.pessoa == null) {
this.pessoa = new Pessoa();
}
}
@PostConstruct
public void init() {
}
/** Used by the search routine */
public List<Pessoa> getPessoaBy() {
DaoPessoa dao = new DaoPessoa(Pessoa.class);
List<Pessoa> listagem = null;
try {
listagem = new ArrayList<Pessoa>();
switch (getCamposFiltro()) {
// id
case "1":
if (dao.getPessoaById(pessoa.getIdPessoa()) != null) {
listagem.add(this.pessoa);
}
break;
model = new ListDataModel(listagem);
} catch (Exception ex) {
log.error("Erro na consulta às pessoas", ex);
}
return listagem;
}
/**
* Here is the problem, in viewScopped mode the person instance isn't a safe state instance
* @return "editCliente"
*/
public String alterar() {
String retorno = null;
try {
this.pessoa = getPessoaFromEditOrDelete();
setPessoa(this.pessoa);
retorno = "editCliente";
} catch (Exception ex) {
log.error("Erro ao abrir a tela de edição de clientes", ex);
}
return retorno;
}
/**
* Retrieve the person instance from the dataTable
* @return the person instance
*/
private Pessoa getPessoaFromEditOrDelete() throws Exception {
Pessoa p = (Pessoa)model.getRowData();
return p;
}
/**
* Make a new person instance to edit-view
* @return string to faces-config
*/
public String novo() {
this.pessoa = new Pessoa();
return "editCliente";
}
}
ありがとう!