Mensagem de erro: "timestamp": "2021-10-28T01:12:41.322+00:00", "status": 405, "error": "Method Not Allowed", "trace": "org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported
Mensagem de erro: "timestamp": "2021-10-28T01:12:41.322+00:00", "status": 405, "error": "Method Not Allowed", "trace": "org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported
Oi Ana,
Pela mensagem de erro o método DELETE não foi configurado corretamente no controller.
Posta aqui como está o código da sua classe TopicosController.
package br.com.alura.forum.controller;
import java.net.URI; import java.util.List; import java.util.Optional;
import javax.transaction.Transactional; import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.util.UriComponentsBuilder;
import br.com.alura.forum.controller.dto.DetalhesDoTopicoDto; import br.com.alura.forum.controller.dto.TopicoDto; import br.com.alura.forum.controller.form.AtualizacaoTopicoForm; 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;
//??@Controller @RestController @RequestMapping ("/topicos") public class TopicosController {
@Autowired
TopicoRepository topicoRepository;
@Autowired
CursoRepository cursoRepository;
@GetMapping //Verbo
public List<TopicoDto> lista(String nomeCurso){
// System.out.println(nomeCurso); //Topico topico = new Topico(titulo, mensagem, curso); //Topico topico = new Topico("Dúvida", "Dúvida com Spring", new Curso("Spring", "Programação")); //Mudar para acessar um BD] if (nomeCurso == null) { List topicos = topicoRepository.findAll(); return TopicoDto.converter(topicos); }else { List topicos = topicoRepository.findByCursoNome(nomeCurso); return TopicoDto.converter(topicos); } }
@PostMapping //Verbo
public ResponseEntity<TopicoDto> cadastrar(@RequestBody @Valid TopicoForm form, UriComponentsBuilder uriBuilder ) {
//@RequestBody Indicar ao Spring que os parâmetros enviados no corpo da requisição devem ser atribuídos ao parâmetro do método
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("/{id}")
public ResponseEntity<DetalhesDoTopicoDto> detalhar(@PathVariable Long id) {
// final com tratamento para Id inexistente // Topico topico = topicoRepository.getOne(id); --- Deprecated // Topico topico = topicoRepository.getById(id); Optional topico = topicoRepository.findById(id); if (topico.isPresent()) { return ResponseEntity.ok( new DetalhesDoTopicoDto(topico.get()));
}
return ResponseEntity.notFound().build();
}
@PutMapping("/{id}")
@Transactional
//(avisa ao Spring que é para commitar)
public ResponseEntity<TopicoDto> atualizar(@PathVariable Long id, @RequestBody @Valid AtualizacaoTopicoForm form){
Optional<Topico> optional = topicoRepository.findById(id);
if (optional.isPresent()) {
Topico topico = form.atualizar(id, topicoRepository); // aqui já atualiza no Banco pelo JPA
return ResponseEntity.ok(new TopicoDto(topico));
}
return ResponseEntity.notFound().build();
}
@DeleteMapping("/{id)")
@Transactional
public ResponseEntity<?> remover(@PathVariable Long id){
Optional<Topico> optional = topicoRepository.findById(id);
if (optional.isPresent()) {
topicoRepository.deleteById(id);
return ResponseEntity.ok().build(); //Como deletei não tem como retornar 200
}
return ResponseEntity.notFound().build();
}
}
Oi Ana,
Ta ok o código do controller.
Como você disparou a requisção? Pode mandar um print do postman?