Alterar atributo de um objeto em JSF (ViewScope) ?[RESOLVIDO]

1 resposta
dijava

Pessoal eu postei anteriormente nesse post http://www.guj.com.br/posts/list/223731.java#1146525 que nao esta atualizando o meu objeto, e resolvi mudando o scopo do meu ManagedBean para request, mas agora nao posso fzr isso, o meu managedBean tem q ser ViewScope, minha pagina é o seguinte tem um formulario padrao em tem um datalist com varios objetos com link de editar e remove, clicando no link “editar” ele seta o objeto e coloca os atributos dele no form, ate ai sem problema, agora qnd eu altero um atributo, a descricao por exemplo e clico no botao, qnd ele chega na funcao “btAcao()” o meu objeto ainda esta com o estado antigo, como eu faco para ele chegar com os atributos modificados na pagina ?

<h:head>
	<h:outputStylesheet library="css" name="style.css"/>
	<f:metadata>
	    	<f:viewParam name="id" value="#{acoesAdmBean.id}"/>
   	</f:metadata>
</h:head>
<h:body>
<f:view contentType="text/html"/>
 <div>
  <h:form id="form">
  <p:growl showDetail="true"/>

<h:outputLabel value="Id:" rendered="#{acoesAdmBean.acao.id != null}"/>
<h:inputText value="#{acoesAdmBean.acao.id}" readonly="true" rendered="#{acoesAdmBean.acao.id != null}"/>

  	 <h:outputLabel value="Nome:" for="nome"/>
  	 <h:inputText id="nome" value="#{acoesAdmBean.acao.nome}" /><br/>

	 <h:outputLabel value="descricao:" for="descricao"/>
	 <h:inputTextarea id="descricao" value="#{acoesAdmBean.acao.descricao}" />

	 <p:commandButton value="acao" action="#{acoesAdmBean.btAcao}" update="form"/>	 	
	 

	 <p:dataList value="#{acoesAdmBean.acoes}" var="a">
		  <p:column>
			 <p:panel>
			 	#{a.nome} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 	<h:commandLink value="Editar">
			 		<f:ajax render="@form"/>
			 		<f:setPropertyActionListener value="#{a}" target="#{acoesAdmBean.acao}"/>
			 	</h:commandLink>
			 	 <h:outputLabel value="|"/>
			 	<h:commandLink value="Remover" action="remover">
			 	    <f:ajax render="@form"/>
			 		<f:setPropertyActionListener value="#{a}" target="#{acoesAdmBean.acao}"/>
			 	</h:commandLink>
			 	<br/>
			 	#{a.descricao}
			 </p:panel>
		  </p:column>
		</p:dataList>
  </h:form>
  </div>
</h:body>
@ViewScoped
@ManagedBean(name="acoesAdmBean")
public class acoesAdmBean implements Serializable{
	
	private Acoes acao = new Acoes();
	private EntityManager em;
	private String id;
	private Campanha campanha;
	private List<Acoes> acoes;

	public EntityManager getEm() {
		HttpServletRequest requestScope = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();    
		em = (EntityManager)requestScope.getAttribute("em");
		return em;
	}
	public void setEm(EntityManager em) {
		this.em = em;
	}
	public String getId() {
		if(id == null){
			HttpServletRequest requestScope = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();    
			id = requestScope.getParameter("id");
		}
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}	
	public Campanha getCampanha() {
		return campanha;
	}
	public void setCampanha(Campanha campanha) {
		this.campanha = campanha;
	}
	@PostConstruct
	public void carregaAcoes(){
		System.out.println("contrui AcaoAdmBean !");
		if(acoes == null){
			CampanhaDAO dao = new CampanhaDAO(getEm());
			campanha = dao.busca(Integer.parseInt(getId()));
			acoes = (List<Acoes>) campanha.getAcoes();
		}
	}
	public List<Acoes> getAcoes() {
		return acoes;
	}
	public void setAcoes(List<Acoes> acoes) {
		this.acoes = acoes;
	}
	public Acoes getAcao() {
		System.out.println("pegando acao "+ acao.getDescricao());
		return acao;
	}
	public void setAcao(Acoes acao) {
		this.acao = acao;
		System.out.println("setando acao "+ acao.getDescricao());
	}
	public void btAcao() {
		HttpServletRequest requestScope = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		AcoesDAO dao = new AcoesDAO(em);
		acao = dao.merger(acao);
		acoes = dao.listaEspecifica(campanha);
	}

}

1 Resposta

dijava

pessoal consegui, nao sei se falo felizmente ou infelizmente, era um detalhe bobo, ainda nao estou usando CDI, entao eu coloco o EntityManager como atributo para toda requisicao, e nesse caso meu managedBean é view scope e mandava para o meu DAO o entitymanager assim “AcoesDAO dao = new AcoesDAO(em);” desse jeito o JSF pega entitymanger que esta na memoria e ja tinha fechado conexao por isso ele nao estava mudando o estado do meu objeto, corrigi esse problema assim “AcoesDAO dao = new AcoesDAO(getEm());” pos no meu metodo

public EntityManager getEm() { HttpServletRequest requestScope = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); em = (EntityManager)requestScope.getAttribute("em"); return em; }
é onde eu pego o entityManager da vez ai ele atualiza sem problema !

Criado 11 de novembro de 2010
Ultima resposta 11 de nov. de 2010
Respostas 1
Participantes 1