Olá,
Estou montando um simples cadastro de empresa usando Richfaces.
Eu iniciei o projeto clicando em “Java EE Web Project” na central do JBoss e ele já montou a estrutura do projeto, com um cadastro de Membros.
Seguindo o exemplo criado, criei uma classe (Entity) chamada Empresa, uma classe para Serviços chamada EmpresaService e anotei ela como @Stateless.
Nesta classe EmpresaService eu tenho os métodos salvar, excluir e getEmpresa.
import gmantovani2005.webproject.model.Empresa;
import java.util.Date;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.persistence.EntityManager;
@Stateless
public class EmpresaService {
@Inject
private Logger log;
@Inject
private EntityManager em;
@Inject
private Event<Empresa> empresaEventSrc;
public void salvar(Empresa empresa) throws Exception {
Date data = new Date();
empresa.setDataAlteracao(data);
if (empresa.getId() == null) {
log.info("Salvando registro " + empresa.getNome());
empresa.setAtivo(true);
empresa.setDataCadastro(data);
em.persist(empresa);
} else {
log.info("Alterando registro " + empresa.getNome() + " com ID " + empresa.getId());
em.refresh(empresa);
}
empresaEventSrc.fire(empresa);
}
public void excluir(Empresa empresa) throws Exception {
log.info("Excluindo registro " + empresa.getNome() + " com ID " + empresa.getId());
Empresa aux = em.merge(empresa);
em.remove(aux);
empresaEventSrc.fire(empresa);
}
public Empresa getEmpresa(Long id) {
Empresa empresa = em.find(Empresa.class, id);
return empresa;
}
}
Também criei uma classe de “controller” para a empresa, com a anotação @Model.
Aqui eu criei os métodos que são chamados pela página JSF.
import gmantovani2005.webproject.model.Empresa;
import gmantovani2005.webproject.service.EmpresaService;
import javax.annotation.PostConstruct;
import javax.enterprise.inject.Model;
import javax.enterprise.inject.Produces;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
@Model
public class EmpresaController {
@Inject
private FacesContext facesContext;
@Inject
private EmpresaService empresaService;
private Empresa empresa;
private Long id;
public void salvar() {
try {
empresaService.salvar(empresa);
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Salvo!", "Empresa Salva com Sucesso!"));
initEmpresa();
} catch (Exception e) {
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Erro ao Salvar Empresa!"));
}
}
public void excluir() {
try {
Empresa emp = empresaService.getEmpresa(id);
empresaService.excluir(emp);
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Excluída!", "Empresa Excluída com Sucesso!"));
} catch (Exception e) {
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Erro ao Excluír Empresa!"));
}
}
public void alterar() {
empresa = empresaService.getEmpresa(id);
}
public void novo() {
initEmpresa();
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Produces
@Named
public Empresa getEmpresa() {
return empresa;
}
@PostConstruct
public void initEmpresa() {
empresa = new Empresa();
}
}
Na página JSF eu criei um rich:tabPanel para exibir os dados e também com o formulário para persistência.
Ao criar um novo registro ou para excluir um registro existente, está funcionando corretamente. O problema está ao tentar alterar o registro.
Acredito que o problema está no Controller anotado como @Model, pois o objeto perde a referência ao registro e tenta inserir um novo registro e não alterar o registro existente.
Alterei meu controle para @SessionScoped com @Named, ele apresenta a mensagem que está alterando o registro, mas não altera.
Alguem pode me dizer como devo fazer para que funcione? Qual é a forma correta para fazer isto?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j"
template="/WEB-INF/templates/default.xhtml">
<ui:define name="content">
<h:panelGroup rendered="#{empty empresas}">
<em>Não há empresas cadastradas.</em>
</h:panelGroup>
<rich:tabPanel switchType="client">
<rich:tab header="Lista">
<h:form>
<p>
<h:commandLink value="Novo" action="#{empresaController.novo}" />
</p>
<rich:dataTable value="#{empresas}" var="_empresa" id="tabEmpresa" rendered="#{not empty empresas}" rows="15">
<rich:column id="id">
<f:facet name="header">
Id
</f:facet>
#{_empresa.id}
</rich:column>
<rich:column id="nome">
<f:facet name="header">
Nome
</f:facet>
#{_empresa.nome}
</rich:column>
<rich:column id="apelido">
<f:facet name="header">
Apelido
</f:facet>
#{_empresa.apelido}
</rich:column>
<rich:column id="email">
<f:facet name="header">
E-Mail
</f:facet>
#{_empresa.email}
</rich:column>
<rich:column id="cnpj">
<f:facet name="header">
CNPJ
</f:facet>
#{_empresa.cnpj}
</rich:column>
<rich:column id="telefone">
<f:facet name="header">
Telefone
</f:facet>
#{_empresa.telefone}
</rich:column>
<rich:column id="celular">
<f:facet name="header">
Celular
</f:facet>
#{_empresa.celular}
</rich:column>
<rich:column id="responsavel">
<f:facet name="header">
Responsável
</f:facet>
#{_empresa.responsavel}
</rich:column>
<rich:column id="ativo">
<f:facet name="header">
Status
</f:facet>
#{_empresa.ativo}
</rich:column>
<rich:column>
<h:commandLink value="Alterar" action="#{empresaController.alterar}">
<f:setPropertyActionListener value="#{_empresa.id}" target="#{empresaController.id}" />
</h:commandLink>
</rich:column>
<rich:column>
<h:commandLink value="Remove" action="#{empresaController.excluir}" onclick="if (!confirm('Confirma exclusão?')){return false;};">
<f:setPropertyActionListener value="#{_empresa.id}" target="#{empresaController.id}" />
</h:commandLink>
</rich:column>
</rich:dataTable>
</h:form>
</rich:tab>
<rich:tab header="Formulário">
<h:form>
<h:panelGrid columns="3" columnClasses="titleCell">
<h:outputLabel for="id" value="Id:" rendered="#{not empty empresa.id}"/>
<h:inputText id="id" value="#{empresa.id}" rendered="#{not empty empresa.id}" disabled="true"/>
<h:message for="id" errorClass="invalid" rendered="#{not empty empresa.id}"/>
<h:outputLabel for="nome" value="Nome:"/>
<h:inputText id="nome" value="#{empresa.nome}" />
<h:message for="nome" errorClass="invalid"/>
<h:outputLabel for="apelido" value="Apelido:"/>
<h:inputText id="apelido" value="#{empresa.apelido}" />
<h:message for="apelido" errorClass="invalid"/>
<h:outputLabel for="email" value="E-Mail:"/>
<h:inputText id="email" value="#{empresa.email}" />
<h:message for="email" errorClass="invalid"/>
<h:outputLabel for="cnpj" value="Cnpj:"/>
<h:inputText id="cnpj" value="#{empresa.cnpj}" />
<h:message for="cnpj" errorClass="invalid"/>
<h:outputLabel for="telefone" value="Telefone:"/>
<h:inputText id="telefone" value="#{empresa.telefone}" />
<h:message for="telefone" errorClass="invalid"/>
<h:outputLabel for="celular" value="Celular:"/>
<h:inputText id="celular" value="#{empresa.celular}" />
<h:message for="celular" errorClass="invalid"/>
<h:outputLabel for="responsavel" value="Responsável:"/>
<h:inputText id="responsavel" value="#{empresa.responsavel}" />
<h:message for="responsavel" errorClass="invalid"/>
<h:outputLabel for="site" value="Site:"/>
<h:inputText id="site" value="#{empresa.site}" />
<h:message for="site" errorClass="invalid"/>
<h:outputLabel for="observacao" value="Observação:"/>
<h:inputText id="observacao" value="#{empresa.observacao}" />
<h:message for="observacao" errorClass="invalid"/>
</h:panelGrid>
<p>
<h:panelGrid columns="2">
<h:commandButton id="salvar" action="#{empresaController.salvar}" value="Salvar" styleClass="register"/>
<h:messages styleClass="messages" errorClass="invalid" infoClass="valid" warnClass="warning"
globalOnly="true"/>
</h:panelGrid>
</p>
</h:form>
</rich:tab>
</rich:tabPanel>
</ui:define>
</ui:composition>