1
resposta

Problemas ao retornar o nome do Curso(Form)

Na aula em que foi mostrado como receber dados via post, não estou conseguindo retornar o nome do curso. Percebi também que o retorno tem a data de criação e o ID apenas. Conseguiriam me ajudar, por favor?

O JSON que mando no Postman: { "titulo": "Duvida postman e HTML", "mensagem": "Texto da mensagem HTML", "nomeCurso": "HTML 5" }

O que a API retorna: {"id":4,"titulo":"Duvida postman e HTML","mensagem":"Texto da mensagem HTML","dataCriacao":"2021-02-17T01:25:04.3967158"}

Segue a classe: CursoRepository: public interface CursoRepository extends JpaRepository<Curso, Long>{

Curso findByNome(String nomeCurso);

}

-- TopicoController RestController @RequestMapping("/topicos") public class TopicosController {

@Autowired
private TopicoRepository topicoRepsitory;

@Autowired
private CursoRepository cursoRepository;

@GetMapping
public List<TopicoDto> lista(String nomeCurso){ //parametroURL da Query

// Topico topico = new Topico("Duvida", "Duvida com String", // new Curso("Spring", "Programação"));

    if (nomeCurso == null) {
        List<Topico> topicos = topicoRepsitory.findAll();
        return TopicoDto.converter(topicos);
    } else {
        List<Topico> topicos = topicoRepsitory.findByCursoNome(nomeCurso);    
        return TopicoDto.converter(topicos);
    }
}

@PostMapping
//ResponseEntity retornando codido 201 HTTP, CREATED.
public ResponseEntity<TopicoDto> cadastrar (@RequestBody TopicoForm form, UriComponentsBuilder uriBuilder) {
    Topico topico = form.converter(cursoRepository);
    topicoRepsitory.save(topico);
    URI uri = uriBuilder.path("/topicos/{id}").buildAndExpand(topico.getId()).toUri();
    return ResponseEntity.created(uri).body(new TopicoDto(topico));
}

}

--TopicoForm public class TopicoForm {

private String titulo;
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 converter(CursoRepository cursoRepository) {
    Curso curso = cursoRepository.findByNome(nomeCurso);
    return new Topico(titulo, mensagem, curso);
}

--Topico DTO public class TopicoDto { private Long id; private String titulo; private String mensagem; private LocalDateTime dataCriacao;

public TopicoDto(Topico topico) {
    this.id = topico.getId();
    this.setTitulo(topico.getTitulo());
    this.mensagem = topico.getMensagem();
    this.dataCriacao = topico.getDataCriacao();

}

public Long getId() {
    return id;
}
public String getMensagem() {
    return mensagem;
}
public LocalDateTime getDataCriacao() {
    return dataCriacao;
}

public String getTitulo() {
    return titulo;
}

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


public static List<TopicoDto> converter(List<Topico> topicos) {
    //API Stream Java8+
    return topicos.stream().map(TopicoDto::new).collect(Collectors.toList());
}
1 resposta

Oi Gionni,

O nome do curso realmente não é devolvido pela api, pois a classe dto não tem um atributo com essa informação.

Mas você pode alterar a classe TopicoDto para adicionar tal informação e com isso a api vai passar a retorná-la.

Bons estudos!