[RESOLVIDO] ManagedBean está sendo recriado

7 respostas
julynhaprado

Olá!

Tenho um managed bean anotado com @SessionScoped.
Num arquivo .xhtml que utiliza esse bean, coloquei botões que ao serem clicados mudam o estado de uma ordem de serviço.
Ao clicar no botão o bean está sendo recriado, perdendo os objetos carregados.
O que pode estar acontecendo?

Segue abaixo os códigos para quem puder ajudar.

OrdemServicoBean
@ManagedBean(name = "ordemServicoBean")
@SessionScoped
public class OrdemServicoBean {
	private OrdemServico ordemservico = new OrdemServico();
	private Integer estado = new Integer(0);

	public OrdemServico getOrdemservico() {
		return ordemservico;
	}

	public void setOrdemservico(OrdemServico ordemservico) {
		this.ordemservico = ordemservico;
	}

	public void finalizarParcialmente() {
		this.ordemservico.setEstadoAtual(Estado.PARCIALMENTE_COMPLETO);
	}

	public void finalizarTotal() {
		this.ordemservico.setEstadoAtual(Estado.COMPLETO);
	}
}
controlarordem.xhtml
<h:form id="controlarordem">

			<p:messages showDetail="true" autoUpdate="true" showSummary="false" />
			<h:inputHidden value="#{ordemServicoBean.ordemservico.id}" />
			<p:fieldset id="fs" legend="TUDO" toggleable="true">
				<div class="campo-grupo">
					<h:outputLabel value="Nº OS" />
					<h:outputText name="nos"
						value="#{ordemServicoBean.ordemservico.numero}/#{ordemServicoBean.ordemservico.ano}" />
				</div>

				<div class="campo-grupo">
					<h:outputLabel value="Escola" />
					<h:outputText name="escola"
						value="#{ordemServicoBean.ordemservico.escola.nome}" />
				</div>

				<div class="campo-grupo">
					<h:outputLabel value="Data" />
					<h:outputText name="data"
						value="#{ordemServicoBean.ordemservico.data}" />
				</div>

				<div style="clear: both;"></div>
				
					<div class="campo-grupo">
					<p:commandButton value="Parc. Fin." onclick="confirmaParcial.show()"
						rendered="#{ordemServicoBean.estado == 0 }" />
					<p:confirmDialog message="Confirma a finalização parcial?"
						header="ATENÇÃO" severity="alert" widgetVar="confirmaParcial">
						<p:commandButton value="Sim" update="fs"
							oncomplete="confirmaParcial.hide()"
							action="#{ordemServicoBean.finalizarParcialmente}" />
						<p:commandButton value="Não" onclick="confirmaParcial.hide()"
							type="button" />
					</p:confirmDialog>
				</div>
			</p:fieldset>
</h:form>

7 Respostas

nel

Oi!

Que tipo de valores você perde?
Entenda, ele mantém o último estado da sessão, se você executar uma mesma ação esse objeto será sobrescrito de acordo com a sua implementação.
Ele não mantém várias sessões do mesmo objeto.

Se você tem uma tabela x populada na sessão, quando essa tabela for atualizada ela também será atualizada na sessão, não terão duas tabelas, entende? Não sei se entendi corretamente o seu problema.

A questão é que o seu objeto OrdemServico pode ter valores sobrescritos.
Abraços.

julynhaprado

Oi nel,

Então, eu tenho uma página onde eu tenho 4 dataTable onde existe as ordens separadas por estado, Pendentes, Parcialmente Completo, Completos e Finalizados.
Ao clicar em alguma ordem o objeto é carregado com: ano, data, escola, estadoAtual, executor e id.
Aí eu clico no botão pra alterar o estadoAtual da ordem e o objeto já traz todos esses valores nulos.

Eu não consigo pegar esse mesmo objeto carregado para fazer a mudança de estado?

nel

Oi Juli!

Claro que sim, do mapa da sessão você pode fazer isso:

OrdemServicoBean bean = (OrdemServicoBean ) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("ordemServicoBean");

Agora você tem o seu objeto bean da sessão com os valores atuais e pode manipula-los como desejar.
Se ele não encontrar o objeto com esse nome na sessão, podes mandar imprimir o mapa de sessão e verificar que nome ele está criando, caso contrário, jogar ele na mão no mapa com o nome desejado e recuperar posteriormente.

Abraços.

julynhaprado

Bom dia,

Quando eu clico no botão, chamo um confirmDialog e quando clico no Sim, o estado da ordem é alterado e o botão deve sumir da tela.
Mas na verdade ao clicar no botão, ele está recriando o sessionBean, perdendo os objetos que já estavam carregados. Isso ocorre ao clicar no botão, antes mesmo de poder clicar no botão Sim do confirmDialog.

Alguma idéia do que pode ser?

Obrigada.

julynhaprado

Alguém ? :frowning:

nel

julynhaprado:
Bom dia,

Quando eu clico no botão, chamo um confirmDialog e quando clico no Sim, o estado da ordem é alterado e o botão deve sumir da tela.
Mas na verdade ao clicar no botão, ele está recriando o sessionBean, perdendo os objetos que já estavam carregados. Isso ocorre ao clicar no botão, antes mesmo de poder clicar no botão Sim do confirmDialog.

Alguma idéia do que pode ser?

Obrigada.

Sem postar o seu código a análise fica comprometida. O ideal era que fizesse o post completo do seu Bean e do seu xhtml.
Você seguiu a dica que citei logo acima ?

O seu erro pode ser que possivelmente ele está executando um submit na página e como não há tratamento o objeto da sessão é perdido.
Tente usar o atributo ajax=true no seu componente. Mas volto a repetir, sem seu código fica complexo ajuda-la.

julynhaprado

Resolvido,
Estava faltando no xhtml o inputHidden para os atributos que não tinham elementos associados na página.

Obrigada nel.

Criado 13 de setembro de 2011
Ultima resposta 15 de set. de 2011
Respostas 7
Participantes 2