Cícero Ednilson

Blog sobre Desenvolvimento de Softwares

Home » Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 6: Desenvolvendo cadastro de pessoa.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 6: Desenvolvendo cadastro de pessoa.

0 Flares Twitter 0 Facebook 0 Filament.io 0 Flares ×

Nessa parte do nosso tutorial vamos criar a página e as classes responsáveis pela realização do cadastro de pessoa no nosso sistema.

Páginas do tutorial.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 1: Introdução.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 2: Criando o banco de dados.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 3: Criando o projeto com JSF no Maven.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 4: Criando o template com Facelets.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 5: Desenvolvendo a autenticação do sistema.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 6: Desenvolvendo cadastro de pessoa.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 7: Desenvolvendo cadastro via upload de arquivo XML.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 8: Desenvolvendo consulta com PrimeFaces dataTable.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 9: Formatando LocalDateTime.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 10: Editando um registro.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 11: Excluindo um registro.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 12: Consulta com Carousel PrimeFaces.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 13: Consulta com Gráfico PrimeFaces.

Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 14: Exportando arquivo XML com fileDownload e Jdom.

Criando a entidade para a Pessoa.

No pacote br.com.ciceroednilson.repository.entity vamos criar uma classe com o nome de PessoaEntity, depois vamos deixar nossa classe com o código abaixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package br.com.ciceroednilson.repository.entity;
 
import java.time.LocalDateTime;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
 
 
@Entity
@Table(name="tb_pessoa")
public class PessoaEntity {
 
	@Id
	@GeneratedValue
	@Column(name = "id_pessoa")
	private Integer codigo;
 
	@Column(name = "nm_pessoa")
	private String  nome;
 
	@Column(name = "fl_sexo")
	private String  sexo;
 
	@Column(name = "dt_cadastro")
	private LocalDateTime	dataCadastro;
 
	@Column(name = "ds_email")
	private String  email;
 
	@Column(name = "ds_endereco")
	private String  endereco;
 
	@Column(name = "fl_origemCadastro")
	private String  origemCadastro;
 
	@OneToOne
	@JoinColumn(name="id_usuario_cadastro")
	private UsuarioEntity usuarioEntity;
 
	public Integer getCodigo() {
		return codigo;
	}
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getSexo() {
		return sexo;
	}
	public void setSexo(String sexo) {
		this.sexo = sexo;
	}
	public LocalDateTime getDataCadastro() {
		return dataCadastro;
	}
	public void setDataCadastro(LocalDateTime dataCadastro) {
		this.dataCadastro = dataCadastro;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public String getOrigemCadastro() {
		return origemCadastro;
	}
	public void setOrigemCadastro(String origemCadastro) {
		this.origemCadastro = origemCadastro;
	}
	public UsuarioEntity getUsuarioEntity() {
		return usuarioEntity;
	}
	public void setUsuarioEntity(UsuarioEntity usuarioEntity) {
		this.usuarioEntity = usuarioEntity;
	}
 
}

Criando o modelo para a Pessoa.

Agora vamos criar uma classe no pacote br.com.ciceroednilson.model com o nome de PessoaModel, essa classe vai receber os valores dos campos que vamos informar na nossa página de cadastro, depois vamos deixar nossa classe com o código abaixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package br.com.ciceroednilson.model;
 
import java.time.LocalDateTime;
 
public class PessoaModel {
 
	private Integer 	codigo;
	private String  	nome;
	private String  	sexo;
	private LocalDateTime	dataCadastro;
	private String  	email;
	private String  	endereco;
	private String  	origemCadastro;
	private UsuarioModel    usuarioModel;
 
	public Integer getCodigo() {
		return codigo;
	}
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getSexo() {
		return sexo;
	}
	public void setSexo(String sexo) {
		this.sexo = sexo;
	}
	public LocalDateTime getDataCadastro() {
		return dataCadastro;
	}
	public void setDataCadastro(LocalDateTime dataCadastro) {
		this.dataCadastro = dataCadastro;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public String getOrigemCadastro() {
		return origemCadastro;
	}
	public void setOrigemCadastro(String origemCadastro) {
		this.origemCadastro = origemCadastro;
	}
	public UsuarioModel getUsuarioModel() {
		return usuarioModel;
	}
	public void setUsuarioModel(UsuarioModel usuarioModel) {
		this.usuarioModel = usuarioModel;
	}
 
}

Criando o repositório para a pessoa.

No pacote br.com.ciceroednilson.repository vamos adicionar uma classe com o nome de PessoaRepository, essa classe vai ser responsável por persistir a nossa entidade PessoaEntity, depois de criar a classe vamos deixar ela com o código abaixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package br.com.ciceroednilson.repository;
 
import java.time.LocalDateTime;
 
import javax.inject.Inject;
import javax.persistence.EntityManager;
 
import br.com.ciceroednilson.model.PessoaModel;
import br.com.ciceroednilson.repository.entity.PessoaEntity;
import br.com.ciceroednilson.repository.entity.UsuarioEntity;
import br.com.ciceroednilson.uteis.Uteis;
 
public class PessoaRepository {
 
	@Inject
	PessoaEntity pessoaEntity;
 
	EntityManager entityManager;
 
	/***
	 * MÉTODO RESPONSÁVEL POR SALVAR UMA NOVA PESSOA
	 * @param pessoaModel
	 */
	public void SalvarNovoRegistro(PessoaModel pessoaModel){
 
		entityManager =  Uteis.JpaEntityManager();
 
		pessoaEntity = new PessoaEntity();
		pessoaEntity.setDataCadastro(LocalDateTime.now());
		pessoaEntity.setEmail(pessoaModel.getEmail());
		pessoaEntity.setEndereco(pessoaModel.getEndereco());
		pessoaEntity.setNome(pessoaModel.getNome());
		pessoaEntity.setOrigemCadastro(pessoaModel.getOrigemCadastro());
		pessoaEntity.setSexo(pessoaModel.getSexo());
 
		UsuarioEntity usuarioEntity = entityManager.find(UsuarioEntity.class, pessoaModel.getUsuarioModel().getCodigo()); 
 
		pessoaEntity.setUsuarioEntity(usuarioEntity);
 
		entityManager.persist(pessoaEntity);
 
	}
}

Criando o controller para salvar uma pessoa.

Em src/main/java vamos adicionar um pacote com o nome de br.com.ciceroednilson.pessoa.controller, depois vamos adicionar uma classe com o nome de CadastrarPessoaController, depois vamos deixar nossa classe com o código abaixo.

Na linha 37 podemos ver o método que vai salvar uma nova pessoa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package br.com.ciceroednilson.pessoa.controller;
 
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
 
import br.com.ciceroednilson.model.PessoaModel;
import br.com.ciceroednilson.repository.PessoaRepository;
import br.com.ciceroednilson.usuario.controller.UsuarioController;
import br.com.ciceroednilson.uteis.Uteis;
 
@Named(value="cadastrarPessoaController")
@RequestScoped
public class CadastrarPessoaController {
 
	@Inject
	PessoaModel pessoaModel;
 
	@Inject
	UsuarioController usuarioController;
 
	@Inject
	PessoaRepository pessoaRepository;
 
 
	public PessoaModel getPessoaModel() {
		return pessoaModel;
	}
 
	public void setPessoaModel(PessoaModel pessoaModel) {
		this.pessoaModel = pessoaModel;
	}
 
	/**
	 *SALVA UM NOVO REGISTRO VIA INPUT 
	 */
	public void SalvarNovaPessoa(){
 
		pessoaModel.setUsuarioModel(this.usuarioController.GetUsuarioSession());
 
		//INFORMANDO QUE O CADASTRO FOI VIA INPUT
		pessoaModel.setOrigemCadastro("I");
 
		pessoaRepository.SalvarNovoRegistro(this.pessoaModel);
 
		this.pessoaModel = null;
 
		Uteis.MensagemInfo("Registro cadastrado com sucesso");
 
	}
 
}

Abaixo podemos ver todos os objetos que criamos para o cadastro de pessoa.

Criando a página de cadastro de pessoa.

Na nossa pasta sistema vamos criar uma página com o nome de cadastrarPessoa.xhtml, depois vamos deixar nossa página com o código abaixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
	xmlns:h="http://xmlns.jcp.org/jsf/html"
	xmlns:f="http://xmlns.jcp.org/jsf/core"
	xmlns:p="http://primefaces.org/ui">
 
<h:head>
</h:head>
 
<ui:composition template="/template/layoutBase.xhtml">
 
 
	<ui:define name="content">
 
		   <p:tabView style="width:600px;height:370px;margin:auto;">
	 		 	<p:tab title="Cadastro de Pessoa">
 
	 		 	<h:form id="form-cadastro">	 	
 
	 		 	<h:panelGrid id="panelGrid-campos-form" columns="2" cellpadding="10">
 
	 		 			<p:outputLabel value="Nome" for="inputText-nome"/>
	            		<p:inputText id="inputText-nome" 
	            				  style="width:300px" maxlength="70" 
	            				  value="#{cadastrarPessoaController.pessoaModel.nome}"
	            				  required="true"
	            				  requiredMessage="O nome é de preenchimento obrigatório"/>
 
	            		<p:outputLabel for="selectOneRadio-sexo" value="Sexo:" />
        				<p:selectOneRadio id="selectOneRadio-sexo" 
        						  value="#{cadastrarPessoaController.pessoaModel.sexo}"
        						  required="true"
	            				     	  requiredMessage="O sexo é de preenchimento obrigatório">
 
            				<f:selectItem itemLabel="Masculino" itemValue="M" />
            				<f:selectItem itemLabel="Feminino" itemValue="F" />            				
        				</p:selectOneRadio>
 
	            		<p:outputLabel value="E-mail" for="inputText-email"/>
	            		<p:inputText id="inputText-email" 
	            			     style="width:300px" 
	            			     maxlength="80" 
	            			     value="#{cadastrarPessoaController.pessoaModel.email}"
	            			     required="true"
	            			     requiredMessage="O email é de preenchimento obrigatório"/>           		
 
 
	            		<p:outputLabel value="Endereço" for="inputText-endereco"/>
	            		<p:inputText id="inputText-endereco" 
	            			     style="width:400px" 
	            			     maxlength="200" 
	            			     value="#{cadastrarPessoaController.pessoaModel.endereco}"
	            			     required="true"
	            		             requiredMessage="O endereço é de preenchimento obrigatório"/>
 
	            		<p:spacer/>
 
	            		<p:commandButton value="Salvar" 
	            				 id="commandButton-salvar"
						 icon="ui-icon-gear"
						 actionListener="#{cadastrarPessoaController.SalvarNovaPessoa}"
						 update="panelGrid-campos-form"/>
 
 
	 		 	</h:panelGrid>
 
	 		 		<p:messages showDetail="true" autoUpdate="true" closable="true" severity="warn"/>
	 		 		<p:messages autoUpdate="true" closable="true" severity="error"/>		
		   			<p:messages showDetail="true" autoUpdate="true" closable="true" severity="info"/>
 
	 		 		</h:form>
 
	 			 </p:tab>		 		
 
	 		</p:tabView>
 
 
 
 
 
	</ui:define>
 
</ui:composition>
 
 
</html>

Agora na nossa pasta template vamos abrir o nosso arquivo header.xhtml e vamos adicionar a nossa página de cadastro no menu, também vamos aproveitar e adicionar a página inicial do nosso sistema como mostra a imagem abaixo.

Agora vamos fazer o deploy da nossoa aplicação para efetuarmos um teste no cadastro que acabamos de criar, vamos clicar com o botão direito sobre a nossa aplicação e vamos até Run As-> Run As Server como mostra a imagem abaixo.

Na tela que foi aberta basta clicar em Finish.

Então vamos abrir o browser e acessar a nossa aplicação.

Então vamos clicar no menu Cadastro como mostra a imagem abaixo.

Com a nossa página aberta vamos clicar em Salvar sem preencher os campos, então vamos ver as mensagens de validação como mostra a imagem abaixo.

Essas validações são recursos do PrimeFaces, e estão definidos nos atributos required=”true” e requiredMessage=”texto” dos inputs como mostra a imagem abaixo.

Agora vamos preencher o nosso formulário e depois vamos clicar em Salvar.

Após clicarmos no botão Salvar vamos ver no Console do Eclipse o erro “ERROR: Data truncation: Incorrect datetime value: ‘��’ for column ‘dt_cadastro’ at row 1” , esse erro ocorreu por que o JPA não conseguiu persistir a nossa coluna de data que está definino como LocalDateTime que faz parte da API de data do Java 8.

Corrigindo problema de LocalDateTime no JPA.

Para corrigirmos o problema de cadastro de data com LocalDateTime no JPA vamos criar um conversor com o nome de LocalDateTimeAttributeConverter no pacote br.com.ciceroednilson.uteis, depois vamos deixar nosso conversor com o código abaixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package br.com.ciceroednilson.uteis;
 
import java.sql.Timestamp;
import java.time.LocalDateTime;
 
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
 
@Converter(autoApply = true)
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
 
 
    //TRANSFORMA EM Timestamp NA HORA DE PERSISTIR NO BANCO DE DADOS
    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime localDateTime) {
 
    	if(localDateTime != null)
    		return Timestamp.valueOf(localDateTime);
 
    	return null;
 
    }
 
    //TRANSFORMA UM Timestamp EM LocalDateTime QUANDO RETORNAR DO BANCO PARA ENTIDADE
    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp timestamp) {
 
    	if(timestamp != null)
    		return timestamp.toLocalDateTime();
 
    	return null;
    }
}

Agora vamos tentar realizar um cadastro novamente.

Depois de clicar em Salvar devemos ver uma mensagem como mostra a imagem abaixo.

Então podemos ver no banco de dados o nosso registro cadastrado.

Bom é isso ai amigos, terminamos o cadastro de pessoa via inputs, na próxima parte do nosso tutorial vamos criar uma outra aba no nosso componente tabView para cadastrar registros em lote através de um arquivo xml.

Comentários

Name of author

Name: ciceroednilson@gmail.com

11 thoughts on “Criando uma aplicação Java com JSF, PrimeFaces, CDI e JPA – Parte 6: Desenvolvendo cadastro de pessoa.

  • Bom dia.

    Em primeiro lugar gostaria de parabeniza-lo pelo excelente tutorial. Estou iniciando nessa parte web e o tutorial está ajudando muito.
    Estou seguindo fielmente o passo a passo, inclusive copiando e colando os códigos informados e foi aí que encontrei um problema nesse módulo 6, na parte referente a “Corrigindo problema de LocalDateTime no JPA”. Ele acusa erro nessa linha:

    public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Timestamp> {

    Reply
    • ciceroednilson@gmail.com Post author

      Em primeiro lugar muito obrigado por visitar o blog Marcus,

      Qual é o erro que você recebendo? O LocalDateTime é um objeto do Java 8, qual versão do JDK você está usando?

      Você pode pegar o código completo desse tutorial na última parte, assim pode facilitar a copia dos códigos.

      Abraços!

      Reply
      • Cicero desculpa a demora em responder, estava em viagem.
        O problema estava nos sinais de estavam aparecendo como caracteres especiais. Consegui corrigir. Obrigado pelo pronto atendimento.

        Reply
  • amigo será que poderia dar uma ajuda ? java.lang.NullPointerException
    at br.com.homemade.repository.UsuarioRepository.validaUsuario(UsuarioRepository.java:19)
    at br.com.homemade.usuario.controller.UsuarioController.EfetuarLogin(UsuarioController.java:76)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    não sei porque mas está retornando null

    está dando java.lang.NullPointerException

    public UsuarioEntity validaUsuario(UsuarioModel usuarioModel){

    try{

    Query query = Uteis.JpaEntityManager().createNamedQuery(“UsuarioEntity.findUser”);

    query.setParameter(“usuario”, usuarioModel.getUsuario());
    query.setParameter(“senha”, usuarioModel.getSenha());

    return (UsuarioEntity)query.getSingleResult();

    }catch(Exception e){
    e.printStackTrace();

    return null;

    }

    Reply
  • Boa tarde, COmo eu faço para popular um combox com a minha tabela

    brendon_gama@hotmail.com

    Reply
    • ciceroednilson@gmail.com Post author

      Brendon,

      Você deve ter um componente na sua página como mostra o código abaixo.

      E na sua classe Java você deve ter uma lista com o resultado da consulta que realizou no banco de dados.

      private List listaDados;

      //get set

      Reply
      • Boa noite,
        Poderia me ajudar, eu estou a 2 dias tentando duas coisas e não consigo.
        1 – Popular um SelectOneMenu com os dados do banco
        2- Usar o SelectManyCheckBox esta salvando tudo nulo.

        Por favor poderia fazer um exemplo iguais essas aulas acima, estou ficando doido, eu ja pesquisei na internet mas cada um ensina de um jeito e nenhum funciona neste projeto.

        Aguadeço

        Reply
  • Cícero Ednilson.

    Brendon,

    Mandei no seu email um exemplo dos itens que você está com dificuldade.

    Reply
  • Ola Cícero, seu tutorial é excelente e tem me ajudado bastante a entender o JSF (minha especialidade é o Spring).

    Sobre a classe PessoaRepository, essa linha não estaria redundante? Pois ela é instanciada manualmente dentro do método.

    @Inject
    PessoaEntity pessoaEntity;

    Reply
    • ciceroednilson@gmail.com Post author

      Em primeiro lugar muito obrigado por visitar o blog Samir.

      Ela é instanciada mas não é declarada, nesse momento de salvar o registro você poderia remover o @Inject, como você está instanciando não precisaria injetar o objeto.

      Abraços!

      Reply

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

0 Flares Twitter 0 Facebook 0 Filament.io 0 Flares ×