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

Apenas método GET funcionando - POSTMAN

Olá, boa tarde! Estou criando o método cadastrar POST onde ao tentar criar um novo topico, recebo 400.

Validei cada linha do código e está tudo ok, já tentei de tudo e nada soluciona o erro 400

*Meu código esta da seguinte forma: exatamente o mesmo da aula *

@PostMapping public ResponseEntity cadastrar (@RequestBody @Valid TopicoForm form, UriComponentsBuilder uriBuilder){ Topico topico = form.converter(cursoRepository); topicoRepository.save(topico);

    URI uri = uriBuilder.path("/topicos/{id}").buildAndExpand(topico.getId()).toUri();
    return ResponseEntity.created(uri).body(new TopicoDto(topico));
}

**E no Body do postman: **

{
"titulo": "Dúvida curso",
"mensagem": "Texto da mensagem",
"nomeCurso": "Spring Boot"

}

**Recebo essa resposta**
<body>
<h1>HTTP Status 400 – Bad Request</h1>
<hr class="line" />
<p><b>Type</b> Status Report</p>
<p><b>Description</b> The server cannot or will not process the request due to something that is perceived to be a
    client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).
</p>
<hr class="line" />
<h3>Apache Tomcat/9.0.48</h3>

E criei o método detalhar que é um GET, que faz a busca por um ID, no meu banco H2 tenho 3 topicos cadastrados e não consigo trazer nenhum deles, pois recebo um 404 notFound

Segue como o meu código ficou @GetMapping("/topicos/{id}") public TopicoDto detalhar(@PathVariable Long id){ Topico topico = topicoRepository.getById(id); return new TopicoDto(topico); }

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

*No postman estou buscando da seguinte forma: * http://localhost:8080/topicos/3

A resposta é que recebo é { "timestamp": "2021-07-17T16:25:23.891+00:00", "status": 404, "error": "Not Found", "message": "No message available", "path": "/topicos/3" }

OBS: quando utilizo o método lista, todos os meu 3 topicos é listados no Postman

Rodrigo, me de uma luz, por favor!
5 respostas

Oi Aline,

Voce pode postar aqui o codigo completo das suas classes TopicosController, TopicoDto e TopicoForm

Olá, Rodrigo! Posso sim,

TopicosController

package br.com.alura.forum.controller; import br.com.alura.forum.controller.dto.DetalhesDoTopicoDto; import br.com.alura.forum.controller.dto.TopicoDto; import br.com.alura.forum.controller.form.TopicoForm; import br.com.alura.forum.modelo.Topico; import br.com.alura.forum.repository.CursoRepository; import br.com.alura.forum.repository.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.net.URI; import java.util.List;

@RestController @RequestMapping("/topicos")

public class TopicosController {

@Autowired
private TopicoRepository topicoRepository;

@Autowired
private CursoRepository cursoRepository;


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

}

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

    URI uri = uriBuilder.path("/topicos/{id}").buildAndExpand(topico.getId()).toUri();
    return ResponseEntity.created(uri).body(new TopicoDto(topico));
}

@GetMapping("/topicos/{id}")
public DetalhesDoTopicoDto detalhar(@PathVariable Long id){
    Topico topico = topicoRepository.getById(id);
    return new DetalhesDoTopicoDto(topico);
}

}

TopicoDTO

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

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

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

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

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

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

public Long getId() {
    return id;
}

public String getTitulo() {
    return titulo;
}

public String getMensagem() {
    return mensagem;
}

public LocalDateTime getDataCriacao() {
    return dataCriacao;
}

}

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; import com.sun.istack.NotNull; import javax.validation.constraints.NotEmpty;

public class TopicoForm {

@NotNull @NotEmpty
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);
}

}

Rodrigo, o método detalhar GET, achei o erro estava passando /topicos/{id}

@GetMapping("/topicos/{id}")

solução!

Oi Aline,

Resta agora apenas o problema do cadastro, certo?

Aparentemente seu codigo esta certinho e nao identifiquei qual seia o problema =/

Chutaria que deve ser algo relacionado ao postman. Consegue mandar um print de como voce esta disparando a requisicao nele?

Oie Rodrigo, agora estou conseguindo fazer a requisição!

Não fiz nenhuma alteração e ele passou a funcionar, deve ser algum tipo de bug :(

Muito obrigada pela ajuda!

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