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

[Bug] Erro 404 no cadastro

Eu fiz o tratamento de erros no pacote infra, porem quando vou tentar cadastrar um novo medico que antes estava funcionando agora nao funciona mais mesmo os campos ainda estando iguais. E se eu apagar algum campo do json e rodar ao inves de aparecer o erro 400 ele devolve o erro 404

12 respostas

coloque seu código para que possamos te auxiliar.

Assim esta o meu controler `RestController @RequestMapping("medicos") public class MedicoController {

@Autowired
private MedicoRepository repository;

@PostMapping
@Transactional
public ResponseEntity cadastrar(@RequestBody @Valid DadosMedico dados, UriComponentsBuilder uriBuilder) {

    var medico = new Medico(dados);
    repository.save(medico);

    var uri = uriBuilder.path("/medicos/{id}").buildAndExpand(medico.getId()).toUri();

    return ResponseEntity.created(uri).body(new DadosInformacionalMedico(medico));
}

@GetMapping
public ResponseEntity<Page<ListagemMedicos>> listar(@PageableDefault(size =10, sort ={"nome"}) Pageable paginacao){
    var page = repository.findAllByAtivoTrue(paginacao).map(ListagemMedicos::new);
    return ResponseEntity.ok(page);
}

@PutMapping
@Transactional
public ResponseEntity atualiza(@RequestBody @Valid DadosAtualizadoMedico dados) {
    var medico = repository.getReferenceById(dados.id());
    medico.atualizaInformacao(dados);
    return ResponseEntity.ok(new DadosInformacionalMedico(medico));
}

@DeleteMapping("/{id}")
@Transactional
public ResponseEntity excluir(@PathVariable Long id) {
    var medico = repository.getReferenceById(id);
    medico.excluir();
    return ResponseEntity.noContent().build();
}

@GetMapping("/{id}")
public ResponseEntity detalhar(@PathVariable Long id) {
    var medico = repository.getReferenceById(id);
    return ResponseEntity.ok(new DadosInformacionalMedico(medico));
}

} e o tratador de erros esta assim@RestControllerAdvice public class TrtadorDeErro {

@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity trtaErro404() {
    return ResponseEntity.notFound().build();
}

}`

O erro está no seu código a seguir:

@ExceptionHandler(EntityNotFoundException.class) public ResponseEntity trtaErro404() { return ResponseEntity.notFound().build(); }

Tenta substituir pelo código a seguir e ver se dar certo:

@RestControllerAdvice public class TratadorDeErros {

@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity tratarErro404() {
    return ResponseEntity.notFound().build();
}

}

OBS: Não esqueça dos imports.

Abraço!

Boa noite eu testei desse forma e de muitas outras porem o erro perciste, eu nao onde pode estar o erro eu troquei recentemnete de notebook isto pode influenciar com o codgio no localhost? Pois eu importei a collection do meu insomnia do antigo para o novo notebook se puder continuar me ajudando ficaria agradecido

Oi!

Sua classe TrtadorDeErro tem outros métodos? No código que você mandou, ela está tratando apenas exceptions do tipo EntityNotFoundException. Mande aqui um exemplo do json que você está enviando.

Este é o json que estou enviando usano o insomnia { "nome": "Jorge Macedo", "email": "jorge.macedo@absolut.med", "crm": "122345", "telefone": "41992234444", "especialidade": "NEUROLOGIA", "endereco": { "logradouro": "rua 2", "bairro": "Agua verda", "cep": "12345678", "cidade": "Curitiba", "uf": "CW", "numero": "1", "complemento": "complemento" } } . E na classe TratadorDeErros eu nao tenho mais nenhum metodo agora a saida no console esta assim:2024-05-28T17:00:43.450-03:00 WARN 4316 --- [nio-8080-exec-2] o.s.web.servlet.PageNotFound : No mapping for POST /medicos 2024-05-28T17:00:43.457-03:00 WARN 4316 --- [nio-8080-exec-2] o.s.web.servlet.PageNotFound : No endpoint POST /medicos.

Deu alguma exception no console? Manda aqui a stacktrace.

"timestamp": "2024-05-28T19:47:51.474+00:00",
    "status": 404,
    "error": "Not Found",
    "trace": "org.springframework.web.servlet.NoHandlerFoundException: No endpoint POST /medicos.\r\n\tat org.springframework.web.servlet.DispatcherServlet.noHandlerFound(DispatcherServlet.java:1304)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\r\n\tat java.base/java.lang.Thread.run(Thread.java:842)\r\n",
    "message": "No endpoint POST /medicos.",
    "path": "/medicos"
}    

O erro que está dando é porque o spring não está encontrando o controller com o mapeamento da requisição POST para a url /medicos

Mas olhando o seu código ele está correto. Confere se sua classe MedicoController está anotada com @RestController e manda aqui um print da estrutura da pacotes do seu projeto no Intellij.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade estou usando o eclipse porque eu prefiro ele

solução!

O problema está na sua estrutura de pacotes.

Sua classe main (ApiApplication) está no pacote med.absolut.api e com isso o Spring somente enxerga as classes que estiverem dentro deste pacote e de seus subpacotes.

Sua classe controller está no pacote med.absolut.contoller que não é um pacote filho do pacote onde está a classe main, e com isso o Spring não carregou essa classe controller. A mesma coisa vai acontecer com outras classes que estiverem em pacotes que não são filhos do pacote med.absolut.api.

Ajustes seus pacotes que o problema será resolvido.

entendi obrigado professor