Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Topico criado não é encontrado na busca com parametros

Boa tarde, criei um novo tópico com um curso existente na base de dados e fiz o teste de busca do tópico com parametros passando o nome do curso, porém a busca só retorna os tópico que foram inseridos via seed, não retorna o que foi inserido via Post.

6 respostas

Oi Andreza,

Posta aqui o código da suas classes TopicosController e TopicosRepository, e também se você conseguir um print dos dados no banco de dados.

Olá, seguem minhas as informações solicitadas:

TopicoController:

package br.com.andrezasecon.forum.controllers;

import br.com.andrezasecon.forum.domain.Topico;
import br.com.andrezasecon.forum.dto.TopicoDto;
import br.com.andrezasecon.forum.dto.TopicoForm;
import br.com.andrezasecon.forum.repositories.CursoRepository;
import br.com.andrezasecon.forum.repositories.TopicoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.UriComponentsBuilder;

import javax.validation.Valid;
import java.io.Serializable;
import java.net.URI;
import java.util.List;

@RestController
@RequestMapping(value = "/topicos")
public class TopicosController implements Serializable {
    private static final long serialVersionUID = 1L;

    @Autowired
    private TopicoRepository topicoRepository;

    @Autowired
    private CursoRepository cursoRepository;

    @GetMapping 
    public List<TopicoDto> list(String nomeCurso){
        if(nomeCurso == null){
            List<Topico> topicos = topicoRepository.findAll(); 
            return TopicoDto.convert(topicos);
        }else{
            List<Topico> topicos = topicoRepository.findByCursoNomeIgnoreCaseContaining(nomeCurso); 
            return TopicoDto.convert(topicos);
        }
    }

    @PostMapping  
    public ResponseEntity<TopicoDto> cadastrar(@RequestBody @Valid TopicoForm topicoForm, UriComponentsBuilder uriBuilder) {
        Topico topico = topicoForm.convert(cursoRepository);
        topicoRepository.save(topico);

        URI uri = uriBuilder.path("/topicos/{id}").buildAndExpand(topico.getId()).toUri();
        return ResponseEntity.created(uri).body(new TopicoDto(topico)); // na semantica do 201 created, na resposta temos que passar a URI

    }

}

TopicosRepository:

package br.com.andrezasecon.forum.repositories;

import br.com.andrezasecon.forum.domain.Topico;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;


public interface TopicoRepository extends JpaRepository<Topico, Long> {

    List<Topico> findByCursoNomeIgnoreCaseContaining(String nomeCurso);

}

No banco o curso está ficando como nulo, acredito q por isso não esta vindo na busca! Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Oi Andreza,

O problema é que os novos registros estão salvos na tabela com o CURSO_ID null.

Posta aqui sua classe TopicoForm e um print de como você disparou a requisição pra cadastrar um tópico no Postman

Oi Rodrigo, segue:

package br.com.andrezasecon.forum.dto;

import br.com.andrezasecon.forum.domain.Curso;
import br.com.andrezasecon.forum.domain.Topico;
import br.com.andrezasecon.forum.repositories.CursoRepository;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

public class TopicoForm {

    @NotNull @NotEmpty @Length(min = 5, max = 100)
    private String titulo;
    @NotNull @NotEmpty @Length(min = 10, max = 500)
    private String mensagem;
    private String nomeCurso;


    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    public String getNomeCurso() {
        return nomeCurso;
    }

    public void setNomeCurso(String nomeCurso) {
        this.nomeCurso = nomeCurso;
    }

    public Topico convert(CursoRepository cursoRepository) {
        Curso curso = cursoRepository.findByNome(nomeCurso); //buscando o nome do curso no banco
        return new Topico(titulo, mensagem, curso); // utilizando o construtor na classe tópico
    }
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Também tentei fazer a insersão colacando o ID do curso e deu a mesma coisa!

solução!

Oi Andreza,

Na requisição no Postman você enviou o parâmetro chamado curso, mas na classe TopicoForm o atributo se chama nomeCurso.

Então o Json que você deve enviar no Postman tem que ser assim:

{
    "titulo" : "Teste adicionando Topico",
    "mensagem" : "Erro ao criar um recursos com método PUT",
    "nomeCurso" : "Spring"
}

Obs: precisa também existir um curso com nome Spring na sua tabela de cursos.

Era isso mesmo Rodrigo, obrigado pela ajuda e paciência!