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

erro usando um metodo DTO com mais itens

Ola Rodrigo e outros colegas, Rodrigo por que estou tendo erro na linha 27 e creio que terei na linha 28, Não estou buscando pela Classe Topico, pois já existem o relacionamento e ele permite chegar lar pelo .getAutor().getNome por que ele compila, mas dá erro quando uso o get no POSTMAN para buscar no banco ??

// this.autorDTO = topico.getAutor().getNome(); // this.CursoDTO = topico.getCurso().getNome();

o erro diz que é null

java.lang.NullPointerException: null at br.com.alura.forum.model.dto.TopicosDTO.(TopicosDTO.java:26) ~[classes/:na] at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) ~[na:1.8.0_241] at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source) ~[na:1.8.0_241] at java.util.stream.AbstractPipeline.copyInto(Unknown Source) ~[na:1.8.0_241] at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) ~[na:1.8.0_241] at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source) ~[na:1.8.0_241]

package br.com.alura.forum.model.dto;

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

import br.com.alura.forum.model.Topico;

public class TopicosDTO {

    private Long id;
    private String titulo;
    private String mensagem;
    private String autorDTO;
    private String CursoDTO;
    private LocalDateTime dataCriacao;



/*************CONSTRUTOR*/
    public TopicosDTO(Topico topico) {
        this.id = topico.getId();
        this.titulo = topico.getTitulo();
        this.mensagem = topico.getMensagem();        
        this.dataCriacao = topico.getDataCriacao();
        this.autorDTO = topico.getAutor().getNome();
        this.CursoDTO = topico.getCurso().getNome();
    }// fim do construtor

    /*********************** GETS*/
    public Long getId() {
        return id;
    }

    public String getTitulo() {
        return titulo;
    }

    public String getMensagem() {
        return mensagem;
    }

    public String getAutorDTO() {
        return autorDTO;
    }

    public String getCursoDTO() {
        return CursoDTO;
    }

    public LocalDateTime getDataCriacao() {
        return dataCriacao;
    }



/**************** metodo de converter ENTITY em DTO*/
    public static List<TopicosDTO> converter(List<Topico> topicos) {
        // TODO Auto-generated method stub
        return topicos.stream().map(TopicosDTO:: new).collect(Collectors.toList());
    }    

}// FIM DA CLASS

Obrigaduuuuu

6 respostas

Oi Antonio,

Só se o seu objeto topico não tiver o autor e o curso setado, ai vai dar nullpointer mesmo.

Mostra aqui como está o código do controller, pois é lá que está sendo criado os objetos topicos para passar ao DTO.

bom dia Rodrigo, eu só fiz 1 metodo para praticar o curso, mas mesmo que não tiver autor e curso setado, não teria que retornar normalmente sem dar este erros?? Ou seja retornar vazio.

lembrando que estou usando o mesmo banco de dados usou no curso, ou seja eu tenho autor, e tenho curso. Por ser um Get não teria que vir já que complilou?? ?


import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import br.com.alura.forum.model.Topico;
import br.com.alura.forum.model.dto.TopicosDTO;
import br.com.alura.forum.repositoty.TopicoRepository;

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

    @Autowired
    private TopicoRepository topicoRepository;

    /*Metodo de buscar */
    @GetMapping
    public List<TopicosDTO> buscaTopicos(String nomeCurso){
        if(nomeCurso == null) {
    List<Topico> topico = topicoRepository.findAll();        
        return TopicosDTO.converter(topico);
        }
        List<Topico> topico = topicoRepository.findByCurso_Nome(nomeCurso);        
        return TopicosDTO.converter(topico);

    }



}// fimd a class

Como você está fazendo o teste no postman? Está passando o nome de um curso para filtrar ou está carregando todos os topicos?

Ola Rodrigo, tanto no PostMan ou no navegador, ele compila, quando envio o GET no postman ou no navegador , mas todos sem filtrar, da erro. Vou fazer o teste filtrando. Mas quando eu comento e faço o que fiz abaixo ele funciona. ele busca no banco ou outros itens, e se eu tirar a string e colocar para buscar topico.getAutor().getNome(); da este erro.

tentei injetar pelo repository do curso e do usuario para buscar no banco de dados, mas não compila, mas este modo compila mas da erro quando .

public TopicosDTO(Topico topico) {
        this.id = topico.getId();
        this.titulo = topico.getTitulo();
        this.mensagem = topico.getMensagem();        
        this.dataCriacao = topico.getDataCriacao();
        this.autorDTO = "falta fazer";   /*topico.getAutor().getNome();*/
        this.CursoDTO = "falta fazer ";    /*topico.getCurso().getNome();*/
    }// fim do construtor

Antonio,

Eu fiz um testes aqui no projeto, utilizando o projeto nesse ponto(aula 3): https://cursos.alura.com.br/course/spring-boot-api-rest/task/57387

E adicionei no DTO o autor e o curso, conforme você está fazendo, e para mim funcionou certinho. No browser ele trouxe o json com o nome do autor e nome do curso.

As classes devem estar assim:

@RestController
public class TopicosController {

    @Autowired
    private TopicoRepository topicoRepository;

    @RequestMapping("/topicos")
    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);
        }
    }
}
public class TopicoDto {

    private Long id;
    private String titulo;
    private String mensagem;
    private LocalDateTime dataCriacao;
    private String autor;
    private String curso;

    public TopicoDto(Topico topico) {
        this.id = topico.getId();
        this.titulo = topico.getTitulo();
        this.mensagem = topico.getMensagem();
        this.dataCriacao = topico.getDataCriacao();
        this.autor = topico.getAutor().getNome();
        this.curso = topico.getCurso().getNome();
    }

    public Long getId() {
        return id;
    }

    public String getTitulo() {
        return titulo;
    }

    public String getMensagem() {
        return mensagem;
    }

    public LocalDateTime getDataCriacao() {
        return dataCriacao;
    }

    public String getAutor() {
        return autor;
    }

    public String getCurso() {
        return curso;
    }

    public static List<TopicoDto> converter(List<Topico> topicos) {
        return topicos.stream().map(TopicoDto::new).collect(Collectors.toList());
    }

}
public interface TopicoRepository extends JpaRepository<Topico, Long> {

    List<Topico> findByCursoNome(String nomeCurso);
}
@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<>();

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Topico other = (Topico) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    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 LocalDateTime getDataCriacao() {
        return dataCriacao;
    }

    public void setDataCriacao(LocalDateTime dataCriacao) {
        this.dataCriacao = dataCriacao;
    }

    public StatusTopico getStatus() {
        return status;
    }

    public void setStatus(StatusTopico status) {
        this.status = status;
    }

    public Usuario getAutor() {
        return autor;
    }

    public void setAutor(Usuario autor) {
        this.autor = autor;
    }

    public Curso getCurso() {
        return curso;
    }

    public void setCurso(Curso curso) {
        this.curso = curso;
    }

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

    public void setRespostas(List<Resposta> respostas) {
        this.respostas = respostas;
    }

}

Confere se está certinho no seu projeto o código das classes.

solução!

Ola Rodrigo ,olhe onde estava o erro! E pior, compilava LOL

@RestController
@RequestMapping("/topicos")
//@RestController("/topicos") o errooooooooooooooooooo