Não chama metodos set no managed bean

7 respostas
L
E aí galera?!
<h:form>
        <a4j:keepAlive beanName="EstruturaMB"/>
        <a4j:status startText="Aguarde..." stopText=" Pronto"/>
        
        ...

        <rich:modalPanel id="painel">
            <rich:panel header="#{EstruturaMB.grupo.nome}" id="formulario">
                <h:panelGrid columns="2">
                    <h:outputText value="Nome:" />
                    <h:inputText required="true" value="#{EstruturaMB.grupo.nome}">
                        <f:validateLength minimum="2"/>
                    </h:inputText>

                    <h:outputText value="Descrição:" />
                    <h:inputTextarea value="#{EstruturaMB.grupo.descricao}"/>
                    
                    <a4j:commandButton actionListener="#{EstruturaMB.confirmar}" value="OK" ajaxSingle="true">
                        <rich:componentControl for="painel" operation="hide" event="oncomplete"/>
                    </a4j:commandButton>
                    <a4j:commandButton actionListener="#{EstruturaMB.cancelar}" value="Cancelar" immediate="true" ajaxSingle="true">
                        <rich:componentControl for="painel" operation="hide" event="oncomplete"/>
                    </a4j:commandButton>
                </h:panelGrid>
            </rich:panel>
        </rich:modalPanel>
    </h:form>
Tenho esse meu código está fazendo quase tudo certo, as funções e efeitos de tela funcionam e todos os metodos no managed bean estão executando suas ações corretamente. Meu problema é que ao clicar no "OK" os metodos de setNome() e setDescricao() nao sao chamados, nem antes nem depois do actionListener, e aí as operações de negócio e persistencia são executadas com os valores iniciais dos atributos do grupo e não os novos inseridos pelo usuário. Alguém tem alguma idéia? Muito Obrigado!

7 Respostas

dev.rafael

Posta ai o código do seu EstruturaMB.

L
Tae, obrigado!
public class ConfigEstruturaBean implements Serializable {

    private Grupo grupo;

    public Grupo getGrupo() {
        return grupo;
    }

    public void adicionarGrupo(ActionEvent evt) {
        grupo = new Grupo();
        grupo.setNome("Novo Grupo");
    }

    public void confirmar(ActionEvent evt) {
        if (!new NegocioEstrutura().salvar(grupo)) {
                FacesContext.getCurrentInstance().addMessage("", 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR,"Não foi possível salvar o novo grupo.",""));
        }
    }

    public void cancelar(ActionEvent evt) {
        //TODO cancelar
    }

    ...

}
@Entity
public class Grupo implements Serializable {

    @Id @GeneratedValue private long id;

    private String nome;
    private String descricao;

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}
dev.rafael
<h:form>  
    <a4j:keepAlive beanName="EstruturaMB"/>  
    <a4j:status startText="Aguarde..." stopText=" Pronto"/>  
      
    ...  
  
    <rich:modalPanel id="painel">  
        <rich:panel header="#{EstruturaMB.grupo.nome}" id="formulario">  
            <h:panelGrid columns="2">  
                <h:outputText value="Nome:" />  
                <h:inputText required="true" value="#{EstruturaMB.grupo.nome}">  
                    <f:validateLength minimum="2"/>  
                </h:inputText>  
  
                <h:outputText value="Descrição:" />  
                <h:inputTextarea value="#{EstruturaMB.grupo.descricao}"/>  

                <!-- Mudei "actionListener" para "action" -->
                <a4j:commandButton action="#{EstruturaMB.confirmar}" value="OK" ajaxSingle="true">  
                    <rich:componentControl for="painel" operation="hide" event="oncomplete"/>  
                </a4j:commandButton>  
                <!-- Mudei "actionListener" para "action" -->
                <a4j:commandButton action="#{EstruturaMB.cancelar}" value="Cancelar" immediate="true" ajaxSingle="true">  
                    <rich:componentControl for="painel" operation="hide" event="oncomplete"/>  
                </a4j:commandButton>  
            </h:panelGrid>  
        </rich:panel>  
    </rich:modalPanel>  
</h:form>
public class ConfigEstruturaBean implements Serializable {  
  
    // Inicializei o atributo "grupo"
    private Grupo grupo = new Grupo();  
  
    public Grupo getGrupo() {  
        return grupo;  
    }  
  
    // Retirei o parametro "ActionEvent"
    public void adicionarGrupo() {  
        grupo = new Grupo();  
        grupo.setNome("Novo Grupo");  
    }  

    // Retirei o parametro "ActionEvent"  
    public void confirmar() {  
        if (!new NegocioEstrutura().salvar(grupo)) {  
                FacesContext.getCurrentInstance().addMessage("",   
                        new FacesMessage(FacesMessage.SEVERITY_ERROR,"Não foi possível salvar o novo grupo.",""));  
        }  
    }  
  
    public void cancelar() {  
        //TODO cancelar  
    }  
  
    ...  
  
}

Testa essas modificações e me diz se funcionou. Posta também as versões do JSF e do RichFaces que vc está utilizando.

L

Funcionou não, continua sem chamar os métodos set…
Uso JSF 1.2 + RichFaces 3.3.3 + Facelets 1.1.14

L
Adicionei mais um atributo em grupo, que é uma referencia a outro grupo:
@ManyToOne private Grupo pai;

    @OneToMany(mappedBy="pai")
    private List<Grupo> filhos = new ArrayList<Grupo>();
Adicionei no Bean:
public long getPaiId() {
        return grupo.getPai().getId();
    }

    public void setPaiId(long paiId) {
        grupo.setPai(new NegocioEstrutura().getGrupo(paiId));
    }

    public List<SelectItem> getItemsComboBoxPai() {
        List<SelectItem> lista = new ArrayList<SelectItem>();
        for (Grupo g : new NegocioEstrutura().listarPossiveisPais(grupo)) {
            lista.add(new SelectItem(g.getId(), g.getNome()));
        }
        return lista;
    }
E no formulario do xhtml:
<h:outputText value="Nome:"/>
    <h:inputText required="true" value="#{EstruturaMB.nome}">
        <f:validateLength minimum="2"/>
    </h:inputText>

     <h:outputText value="Grupo Pai:"/>
     <h:selectOneMenu value="#{EstruturaMB.paiId}">
         <f:selectItems value="#{EstruturaMB.itemsComboBoxPai}"/>
     </h:selectOneMenu>

     <h:outputText value="Descrição:" />
     <h:inputTextarea value="#{EstruturaMB.descricao}"/>
O estranho agora é que ele só chama o setPaiId() e somente com o valor 0 (zero), não importa qual grupo eu selecione, sendo que continua sem chamar o setNome() e setDescricao(). Obrigado!
L

Depois de inúmeras tentativas e erros consegui, mas não entendi porque, se alguém tiver uma explicação será muito bem vinda.
A solução foi meramente trocar o evento do rich:componentControl pra onclick no lugar de oncomplete, o ruim é que o modalPanel some antes de acabar a requisição mas os métodos set são todos chamados. Fora bug não consigo pensar em nenhuma outra explicação…

arqueiros

Acho que talvez não seja o seu problema mas já aconteceu comigo de dar erro quando usa-se acentução sem usar os códigos html…

Exemplo da linha abaixo eu acho que pode dar erro

<h:outputText value="Descrição:" />
Criado 8 de setembro de 2010
Ultima resposta 8 de set. de 2010
Respostas 7
Participantes 3