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

Ao cadastrar um novo topico e chamar o método detalhar para ele utilizando o Get pelo Postman recebo um NullPointerException para o campo mensagem.

//método detalhar
@GetMapping("/{id}")
    public DetalhesDoTopicoDto detalhar(@PathVariable Long id) {

        Topico topico = topicoRepository.getOne(id);
        return new DetalhesDoTopicoDto(topico);
    }

//dto
package br.com.alura.forum.controller.dto;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

import br.com.alura.forum.modelo.StatusTopico;
import br.com.alura.forum.modelo.Topico;

// no dto só devolvemos coisas primitivas (String, Enum, etc.)
public class DetalhesDoTopicoDto {

    private Long id;
    private String titulo;
    private String mensagem;
    private LocalDateTime dataCriacao;
    private String nomeAutor;
    private StatusTopico status;
    private List<RespostaDto> respostas;

    public DetalhesDoTopicoDto(Topico topico) {
        this.id = topico.getId();
        this.titulo = topico.getTitulo();
        this.mensagem = topico.getMensagem();
        this.dataCriacao = topico.getDataCriacao();
        this.nomeAutor = topico.getAutor().getNome();
        this.status = topico.getStatus();
        this.respostas = topico.getRespostas().stream().map(RespostaDto::new).collect(Collectors.toList());
    }

    public Long getId() {
        return id;
    }

    public String getTitulo() {
        return titulo;
    }

    public String getMensagem() {
        return mensagem;
    }

    public LocalDateTime getDataCriacao() {
        return dataCriacao;
    }

    public String getNomeAutor() {
        return nomeAutor;
    }

    public StatusTopico getStatus() {
        return status;
    }

    public List<RespostaDto> getRespostas() {
        return respostas;
    }

}

"timestamp": "2020-09-23T18:42:40.240+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "No message available",
    "trace": "java.lang.NullPointerException\r\n\tat br.com.alura.forum.controller.dto.DetalhesDoTopicoDto.<init>(DetalhesDoTopicoDto.java:26
5 respostas

Opa, consegui identificar o problema, eu esqueci de instanciar a ArrayList para as respostas e adicioná-las, porém ainda assim continuo tomando null pointer

public DetalhesDoTopicoDto(Topico topico) {
        this.id = topico.getId();
        this.titulo = topico.getTitulo();
        this.mensagem = topico.getMensagem();
        this.dataCriacao = topico.getDataCriacao();
        this.nomeAutor = topico.getAutor().getNome();
        this.status = topico.getStatus();
        this.respostas = topico.getRespostas().stream().map(RespostaDto::new).collect(Collectors.toList());
    }

Oi Thales,

Acho que o problema é o autor que está vindo null do banco de dados.

No construtor, adicione esse if:

if (topico.getAutor() != null) {
    this.nomeAutor = topico.getAutor().getNome();
}

Só complementando o que o instrutor disse, além do autor, o curso também irá vir nulo, caso não esteja pesquisando por um dos 3 cursos base ( do data.sql)

Então no construtor também é necessário o :

if(topico.getCurso() != null){
    this.nomeCurso = topico.getCurso().getNome()
}

Abraços!

Obrigado Rodrigo, deu certo, consegui trazer o tópico que criei pelo Postman detalhado buscando pelo seu id, e o nomeAutor veio como null no json, porém neste caso quando cadastramos não informamos para o método cadastrar o Autor, não seria certo enviá-lo? Ou como você informou entra naquele caso que ele estaria logado na aplicação e somente após o topico ser criado por ele é que ele seria enviado?

Quanto a resposta do Geovani, não tem o atributo nomeCurso nessa classe, devo criá-lo?

solução!

Oi Thales,

É que nesse curso não será abordado a parte de autenticação, então o autor vai sempre ficar null.

No próximo curso será ensinado a parte de autenticação/autorização.

Você pode adicionar o atributo nomeCurso no DTO, caso queira que seja exibido no JSON devolvido ao Postman.

Bons estudo!