Não consigo passar parâmetro de um bean "request" para um bean "view" [Resolvido]

pessoal como eu posso passar um objeto de uma uma página que tem uma lista de objetos para o detalhe desses objetos??? já fiz de tudo e não estou conseguindo.

Segue meus códigos:

pesquisaContrato.xhtml:

<p:dataTable var="contrato" value="#{pesquisaContratoBean.contratosAnoAtual}"  emptyMessage="Não foi encontrado registro!">
								<p:column>
									<f:facet name="header">
										<h:outputLabel value="Contrato" />
									</f:facet>
									<h:commandLink value="contrato.contrato" action="#{pesquisaContratoBean.editarContrato(contrato)}" >
										<f:setPropertyActionListener target="#{contratoBean.contratoTemp}" value="#{contrato}" /> 
									</h:commandLink>
								</p:column>

.....

detalhaContrato.xhtml:

			<h:form styleClass="form" id="form1">				
				<p:messages id="messages" autoUpdate="true" closable="true" />
					<p:panel>
						<p:panelGrid columns="2">		
							<p:outputLabel for="idContrato"  value = "Contrato: "/>
							<p:inputText id="idContrato" value="#{contratoBean.contratoTemp.numeroContrato}" readonly="#{!contratoBean.estadoEdicao}"/>
							<p:outputLabel for="idAno"  value = "Ano: "/>
							<p:inputText id="idAno" value="#{contratoBean.contratoTemp.ano}" readonly="#{!contratoBean.estadoEdicao}"/>
							<p:outputLabel for="idEmpresa"  value = "Empresa "/>
							<p:inputText id="idEmpresa" value="#{contratoBean.contratoTemp.empresa}" readonly="#{!contratoBean.estadoEdicao}"/>
							<p:outputLabel for="idPregao"  value = "Pregão: "/>
......

pesquisaContratoBean.java:



@Controller
@Scope(value = "request")
public class PesquisaContratoBean extends BaseBean {

	
	//private Contrato contratoTemp;
	private List<Contrato> listContratos; 
	private Contrato contratoSelecionado;
	//private Contrato2008 c2008= new Contrato2008();
	//private Contrato2012 c2012 = new Contrato2012();
	//private ContratoInexigibilidade cInexigibilidade = new ContratoInexigibilidade();
	
	public List<Contrato> getContratosAnoAtual(){
		int ano = Calendar.getInstance().get(Calendar.YEAR);
		
		setListContratos(listContratos =  serviceLocator.getContratoService()
				.findContratosAnoAtual(ano));
		return getListContratos();
	}
	
	@PostConstruct
	public void init()
	{
		System.out.println("PesquisaContratoBean.init()");
		
	}
	
	public String editarContrato(Contrato contrato){ //Contrato contrato){
		return "cadastroContrato.jsf?faces-redirect=true";
        }


.........

editarContratoBean

@Controller
@Scope(value = "view")
public class ContratoBean extends BaseBean {

	private Contrato contratoTemp;
	private Contrato contratoSelecionado;


........

O problema é o seguinte:
quando a pessoa clica no commandLind é instanciado um novo contratoBean (eu sei pois debuguei e é chamado o método marcado com @PostConstruct) e seta a propriedade contratoTemp, em seguida é chamado o método marcado com @preDestroy e esse bean é eliminado. em Seguida é criado outro objeto contratoBean (@PostContruct) porém a propriedade Temp está como null.

Obs: os getters and setters já estão lá só ocultei eles.

Alguem tem alguma solução por favor…

De uma página para outra diretamente eu não aconselharia.

O modo mais simples seria utilizando o Flashscope que aqui mostra como fazer: JSF Exibindo Objeto e Mensagens após Redirect.

Hebert,

Muito obrigado pela resposta. Eu já até tinha visto o post no blog (muito bom por sinal, parabéns), porém eu fiquei na dúvida de como eu poderia recuperar o objeto no próprio MB, (sem fazer referência ao escopo flahs na minha página) e a maneira que eu consegui foi adicionando ao EditaContratoBean o seguinte método:

@PostConstruct public void init() { System.out.println("EditacontratoBean.init()"); if (contratoTemp == null){ contratoTemp = (Contrato)ELFlash.getFlash().get("contrato"); } }

você sabe se é a melhor maneira, ou teria como eu injetar esse valor diretamente na classe EditaContratoBean???

OBS: debugando eu descobrir porque não funciona com <f:setPropertyActionListener target="#{contratoBean.contratoTemp}" value="#{contrato}" />. ele não funciona porque na request do pesquisaContrato.xhtml é instanciado um PesquisaContratoBean.java, quando eu clico no link é instanciado novamente o PesquisaContratoBean (escopo de request) e instancia o editarContratoBean(escopo de visão) e seta a propriedade editaContratoBean.contratoTemp. em seguida ele passa para a próxima tela que é a de detalharContrato.xhtml como esta faz parte de um novo request e de uma nova visão, ele “deleta” as instâncias anteriores e cria uma nova instância de editaContraboBean sem referência à propriedade contratoTemp setada anteriormente. (espero que tenham entendido).

porém segundo o site: http://www.oio.de/public/java/jsf-best-practices-javaserver-faces-session-tips.htm na parte de “Sharing information between views” isto deveria funcionar…

Muito obrigado novamente Hebert.