Projeto Java Com Spring
Projeto Java Com Spring
Projeto Java Com Spring
https://www.udemy.com/user/nelio-alves
Prof. Dr. Nelio Alves
Objetivo geral:
O estudo de caso deste capítulo tem como objetivo mostrar na prática como um modelo conceitual (modelo de
domínio em nível de análise) pode ser implementado sobre o paradigma orientado a objetos, usando padrões de
mercado e boas práticas.
Vamos tomar como caso um modelo conceitual abrangente, com o qual possamos mostrar a implementação prática
em linguagem orientada a objetos dos seguintes tópicos:
Ao longo do capítulo também vamos discutir e mostrar boas práticas de Engenharia de Software tais como
desenvolvimento em camadas e tratamento de exceções. A estrutura de camadas do sistema será conforme
mostrado a seguir:
Objetivos específicos:
Enumerações:
Objetivos (continuação):
3) Gerar uma base de dados relacional automaticamente a partir do modelo conceitual, bem como povoar a base com a instância dada.
4) Recuperar os dados e disponibilizá-los por meio de uma API Rest BÁSICA. Os seguintes end points devem ser disponibilizados:
ATUALIZAÇÃO
ATENÇÃO: INSTALE A VERSÃO 8 DO JAVA JDK
Link Java 8 JDK: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Git
Conta no Github
Google Chrome e Postman
JDK - Java Development Kit
STS - Spring Tool Suit (Eclipse / Maven / Tomcat / Jackson / JPA)
ATUALIZAÇÃO
Erro comum: versão do Java JDK
Recomendação: instale o Java versão 8 e 64bits
Vídeo: https://www.youtube.com/watch?v=HtA7EGRyPb0
Link Java 8 JDK: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
As atualizações serão mostradas apenas na primeira vez em que elas forem necessárias.
Botão direito na área da aba Package Explorer -> New -> Spring Starter Project
o Se não aparecer: New -> Other -> Procure
Opções:
o Name: cursomc
o Type: Maven
o Java Version: 1.8
o Group: com.nelioalves.cursomc
o Artifact: cursomc
o Version: 1.0.0-SNAPSHOT (é uma convenção do Maven)
o Description: Estudo de caso Java para curso de Modelagem Conceitual com UML
o Package: com.nelioalves.cursomc
o Next
Opções
o Spring Boot Version: 1.5.x ou 2.x.x
o Web -> Web
Testando o REST
package com.nelioalves.cursomc.resources;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/categorias")
public class CategoriaResource {
@RequestMapping(method=RequestMethod.GET)
public String listar() {
return "REST está funcionando!";
}
}
Testando a primeira classe de dominio - Categoria
@RequestMapping(method=RequestMethod.GET)
public List<Categoria> listar() {
Categoria cat1 = new Categoria(1, "Informática");
Categoria cat2 = new Categoria(2, "Escritório");
return lista;
}
spring.datasource.url=jdbc:h2:file:~/test
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
Dependências:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
@Entity
public class Categoria implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
ATUALIZAÇÃO
Se você criou o projeto usando Spring Boot versão 2.x.x:
https://github.com/acenelio/springboot2-ionic-backend
ATUALIZAÇÃO
Se você criou o projeto usando Spring Boot versão 2.x.x:
https://github.com/acenelio/springboot2-ionic-backend
categoriaRepository.save(Arrays.asList(cat1, cat2));
Troque pelo seguinte código:
categoriaRepository.saveAll(Arrays.asList(cat1,
Texto cat2));
@ManyToMany
@JoinTable(name = "PRODUTO_CATEGORIA",
joinColumns = @JoinColumn(name = "produto_id"),
inverseJoinColumns = @JoinColumn(name = "categoria_id")
)
private List<Categoria> categorias = new ArrayList<>();
@ManyToMany(mappedBy="categorias")
private List<Produto> produtos = new ArrayList<>();
ATUALIZAÇÃO
Se você criou o projeto usando Spring Boot versão 2.x.x:
https://github.com/acenelio/springboot2-ionic-backend
Em CategoriaService, onde na aula é mostrado:
o Criar ObjectNotFountException
o Criar StandardError
o Criar ResourceExceptionHandler
Estado e Cidade
Mapeamentos:
@Entity
public class Cidade implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String nome;
@ManyToOne
@JoinColumn(name="estado_id")
private Estado estado;
@Entity
public class Estado implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id; dsfsdfdsgreyerydg
private String nome; dssdgsdgsd
@OneToMany(mappedBy="estado") sdgsd
private List<Cidade> cidades; g
Implementação do Enum:
package com.nelioalves.cursomc.domain.enums;
if (id == null) {
return null;
}
@ElementCollection
sgsdgsdgg
@CollectionTable(name ="TELEFONE") sdgsdg
private Set<String> telefones = new HashSet<>();
sdg
sdgs
Endpoint /clientes/{id} disponivel
gsd
gs
Checklist:
o Criar ClienteServico dg
o Criar ClienteResource
o Proteger contra serialização Json cíclica
CORREÇÃO
Favor usar HH maiúsculo.
Classe Pedido:
@Entity
public class Pedido implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Temporal(TemporalType.TIMESTAMP)
private Date instante;
@ManyToOne
@JoinColumn(name="cliente_id")
private Cliente cliente;
@ManyToOne
@JoinColumn(name="endereco_id")
private Endereco enderecoDeEntrega;
Classe Pagamento:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Pagamento implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Integer id;
@JoinColumn(name="pedido_id")
@OneToOne
@MapsId
private Pedido pedido;
Classe PagamentoComBoleto:
@Entity
public class PagamentoComBoleto extends Pagamento {
private static final long serialVersionUID = 1L;
@Temporal(TemporalType.DATE)
private Date dataVencimento;
@Temporal(TemporalType.DATE)
private Date dataPagamento;
public PagamentoComBoleto() {
}
Classe PagamentoComCartao:
@Entity
public class PagamentoComCartao extends Pagamento {
private static final long serialVersionUID = 1L;
Instanciação:
cli1.getPedidos().addAll(Arrays.asList(ped1, ped2));
pedidoRepository.save(Arrays.asList(ped1, ped2));
pagamentoRepository.save(Arrays.asList(pagto1, pagto2));
ItemPedido e ItemPedidoPK
Classe ItemPedidoPK:
@Embeddable
public class ItemPedidoPK implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn(name="pedido_id")
private Pedido pedido;
@ManyToOne
@JoinColumn(name="produto_id")
private Produto produto;
ATENÇÃO: no hashCode e equals, incluir ambos objetos associados que identifica o item
Classe ItemPedido:
@Entity
public class ItemPedido {
@EmbeddedId
private ItemPedidoPK id = new ItemPedidoPK();
public ItemPedido() {
}
CORREÇÃO
Favor usar HH maiúsculo.
Classe Pedido:
@JsonFormat(pattern="dd/MM/yyyy HH:mm")
Checklist:
o Criar PedidoServico
o Criar PedidoResource
o Proteger contra serialização Json cíclica