Bom, eu tive um problema parecido em uma tela aqui. Eu não sei se é a forma mais correta de fazer, mas no meu caso eu fiz o seguinte.
1 - Quando o usuário vem da tela anterior (a tela de listagem) eu chamo um método no managed bean:
...
//Usuário veio da tela de solicitacao (solicitação feita pelo cliente)
public String iniciarPelaSolicitacao(Long idSolicitacao) {
log.info("Usuário entrou na tela pela tela de solicitação! ID --> " + idSolicitacao);
tipoAberturaFormulario = TipoAberturaFormulario.PREENCHIMENTO;
try {
formulario = SpringFacesUtil.getFormularioService().getFormularioAtual();
JsfUtil.addRequestAtribute(CHAVE_FORMULARIO, formulario);
...
A última linha acima adiciona o bean vindo da tela anterior no escopo de request “na marra”, ou seja, chamando
FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put(chave, obj);
2 - No método get do managedbean que retorna o bean para cadastro ou edição, eu verifico se o mesmo existe no
escopo de request antes e caso exista eu retorno ele:
public Formulario getFormulario() {
Formulario frmTmp = (Formulario) JsfUtil.getRequestAtribute(CHAVE_FORMULARIO);
if(frmTmp != null) {
formulario = frmTmp;
}
return formulario;
}
Na primeira linha do método acima eu verifico se o bean existe no escopo de request e se existir eu coloco ele no campo do managedbean que está
com escopo viewscope. A declaração do bean para o formulário é a seguinte:
@ManagedBean
@ViewScoped
public class FormularioBean implements Serializable{
private static Logger log = Logger.getLogger(FormularioBean.class);
private static final String CHAVE_FORMULARIO = "CHAVE_FORMULARIO";
private static final String CHAVE_TIPO_ABERTURA = "CHAVE_TIPO_ABERTURA";
private static final String CHAVE_ID_SOLICITACAO = "CHAVE_ID_SOLICITACAO";
private static final String CHAVE_IDS_RESPOSTAS_INVALIDAS = "CHAVE_IDS_RESPOSTAS_INVALIDAS";
static enum TipoAberturaFormulario{PREENCHIMENTO, EDICAO_FORMULARIO, VALIDACAO, REVISAO_FORMULARIO_REPROVADO, PREENCHIMENTO_PARA_PUBLICACAO_SITE};
private Formulario formulario = new Formulario();
Como eu sempre crio ele (new Formulario()), quando entro na tela de inclusão ele cria um novo e quando eu entro para edição como visto no item 1 eu coloco o bean da tela anterior no escopo de request e este é substituído no método get.
Esse método eu utilizei em uma das telas, mas depois eu percebi que o melhor é deixar tudo na mesma tela, sendo que a edição eu coloco em um p:dialog que fica invisível e passei a fazer assim nas outras.