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

Cadastro de tópico retornando título e mensagem como 'null'

Estou tentando cadastrar um tópico e recebo status 201, e são criados no banco, mas no response body, o título e a mensagem retornam 'null',

POST - localhost:8080/topicos

Request Body

{
    "titulo": "Dúvida 123",
    "mensagem": "Testando :(",
    "nomeCurso": "Spring Boot"
}

Response Body

{
    "id": 5,
    "titulo": null,
    "mensagem": null,
    "dataCriacao": "2020-08-18T19:57:06.978418"
}
ID      DATA_CRIACAO      MENSAGEM      STATUS      TITULO      AUTOR_ID      CURSO_ID  
1    2019-05-05 18:00:00    Erro ao criar projeto    NAO_RESPONDIDO    Dúvida    1    1
2    2019-05-05 19:00:00    Projeto não compila    NAO_RESPONDIDO    Dúvida 2    1    1
3    2019-05-05 20:00:00    Tag HTML    NAO_RESPONDIDO    Dúvida 3    1    2
4    2020-08-18 19:56:24.198315    null    NAO_RESPONDIDO    null    null    null
5    2020-08-18 19:57:06.978418    null    NAO_RESPONDIDO    null    null    null
6    2020-08-18 20:04:08.41451    null    NAO_RESPONDIDO    null    null    null
7    2020-08-18 20:04:29.787707    null    NAO_RESPONDIDO    null    null    null
4 respostas

Aqui o meu TopicosController

package br.com.alura.forum.controller;

import java.net.URI;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

import br.com.alura.forum.controller.form.TopicoForm;
import br.com.alura.forum.dto.TopicoDTO;
import br.com.alura.forum.modelo.Topico;
import br.com.alura.forum.repository.CursoRepository;
import br.com.alura.forum.repository.TopicoRepository;

@RestController
@RequestMapping(path = "/topicos")
public class TopicosController {

    @Autowired
    private TopicoRepository topicoRepository;

    @Autowired
    private CursoRepository cursoRepository;

    @GetMapping
    @ResponseBody
    public List<TopicoDTO> lista(String nomeCurso) {

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

    @PostMapping
    public ResponseEntity<TopicoDTO> cadastrar(@RequestBody TopicoForm topicoForm, UriComponentsBuilder uriBuilder) {
        Topico topico = topicoForm.converter(cursoRepository);
        topicoRepository.save(topico);
        URI uri = uriBuilder.path("/topicos/{id}").buildAndExpand(topico.getId()).toUri();
        return ResponseEntity.created(uri).body(new TopicoDTO(topico));
    }


}

A classe Topico

package br.com.alura.forum.modelo;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

@Entity
public class Topico {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String titulo;
    private String mensagem;
    private LocalDateTime dataCriacao = LocalDateTime.now();
    @Enumerated(EnumType.STRING)
    private StatusTopico status = StatusTopico.NAO_RESPONDIDO;
    @ManyToOne
    private Usuario autor;
    @ManyToOne
    private Curso curso;
    @OneToMany(mappedBy = "topico")
    private List<Resposta> respostas = new ArrayList<>();

    public Topico() {
    }



    public Topico(String titulo, String mensagem, Curso curso) {
        this.titulo = titulo;
        this.mensagem = mensagem;
        this.curso = curso;
    }

//Implementação omitida

E a classe TopicoForm

package br.com.alura.forum.controller.form;

import br.com.alura.forum.modelo.Curso;
import br.com.alura.forum.modelo.Topico;
import br.com.alura.forum.repository.CursoRepository;

public class TopicoForm{

    private String titulo;
    private String mensagem;
    private String nomeCurso;

    public Topico converter(CursoRepository repository) {
        Curso curso = repository.findByNome(nomeCurso);
        return new Topico(titulo, mensagem, curso);
    }

}
solução!

Ah, descobri o que estava errado.

Não tinha gerado os getters/setters na classe tópicoForm.

Problema resolvido