Sou iniciante em java, spring , jpa e hibernate, estou fazendo um projeto que contém cadastro de usuários, cadastro de endereço e a listagem dos endereços de um usuário específico.
A minha dificuldade está em criar um endpoint que retorne um usuário com a lista de todos seus endereços cadastrados.
alguém pode me ajudar?
O que você já fez até agora?
A criação do endpoint spring em si não eh difícil. Basta criar um método que recebe os parâmetros necessários para a consulta e retornar o resultado desejado, algo assim:
public List<Usuario> recuperarUsuariosComSeusEnderecos() {
List<Usuario> usuarios = usuarioService.recuperarTodos();
return usuarios;
}
Com isso, basta adicionar a anotação @GetMapping para transformar esse método num endpoint http.
Uma outra forma de retorno (que é a que prefiro usar), é retornar uma instância de ResponseEntity, pois te dá mais flexibilidade de manipular o retorno HTTP para casos específicos. Veja: ResponseEntity.
Eu tenho uma chave estrangeira chamada usuário_id na tabela endereços, pois quero puxa apenas um usuário especifico através dessa chave , (não sei se essa lógica tá certa) .
Model de endereço
@Entity
@Table(name="enderecos")
public class Endereco {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column( nullable=false)
@Size(max = 150)
private String lograudoro;
@Column( nullable=false)
private int numero;
@Column( nullable=false)
@Size(max = 10)
private String complemento;
@Column( nullable=false)
@Size(max = 50)
private String bairro;
@Column( nullable=false)
@Size(max = 50)
private String cidade;
@Column( nullable=false)
@Size(max = 50)
private String estado;
@Column( nullable=false)
@Size(max = 10)
private String cep;
@ManyToOne
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JoinColumn(name = "usuario_id")
private Usuario usuario;
Model Usuario
@Entity
@Table(name = "usuarios")
public class Usuario {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // forma nativa do mysql
private long id;
@Column( nullable=false)
@Size(max = 100)
private String nome;
@Column(unique=true, nullable=false)
@Size(max = 100)
private String email;
@Column(unique=true, nullable=false)
@Size(max = 14)
private String cpf;
@Column(name = "data_de_nascimento", nullable=false)
@Size(max = 15)
private String dataDeNascimento;
@OneToMany(mappedBy = "usuario")
private List<Endereco> enderecos;
O que tentei fazer
EnderecoController ( tentando formular uma lógica para busca um usuário especifico com seus endereços)
@GetMapping("/endereco/{id}")
List<Endereco> listaUsuarioUnico(@PathVariable(value="usuario_id") long usuarioid){
return enderecoRepository.findById(usuarioid);
}
@GetMapping("/endereco/{id}")
List<Endereco> listaUsuarioUnico(@PathVariable(value="usuario_id") long usuarioid){
return enderecoRepository.findById(usuarioid);
}
Se a URL do endpoint é /endereco/{id}, o parâmetro @PathVariable deve ter o mesmo nome do parâmetro na URL, porém, está diferente: usuario_id. O correto é: @PathVariable(value="id").