<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>
Não chama metodos set no managed bean
7 Respostas
Posta ai o código do seu EstruturaMB.
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;
}
}
<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.
Funcionou não, continua sem chamar os métodos set…
Uso JSF 1.2 + RichFaces 3.3.3 + Facelets 1.1.14
@ManyToOne private Grupo pai;
@OneToMany(mappedBy="pai")
private List<Grupo> filhos = new ArrayList<Grupo>();
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;
}
<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}"/>
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…
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:" />