Spring Boot控制器路由返回404错误求助(DTO实现后异常)
Spring Boot接口404排查:引入DTO和Mapper后路由失效
问题详情
使用Postman访问Spring Boot项目的CitaController路由时,服务器返回404错误,无法获取JSON格式的实体数据。未引入DTO和Mapper结构前,接口可正常返回所有数据;实现DTO相关结构后,所有路由均出现该异常。服务器运行在8090端口,访问/citas/mostrarTodos时的错误响应如下:
{ "timestamp": "2023-02-06T17:00:50.592+00:00", "status": 404, "error": "Not Found", "message": "No message available", "path": "/citas/mostrarTodos" }
控制器代码:
package com.main.CitaMedica.Controller; import com.main.CitaMedica.DTO.CitaDTO; import com.main.CitaMedica.DTO.MedicoDTO; import com.main.CitaMedica.DTO.PacienteDTO; import com.main.CitaMedica.Service.CitaService; import com.main.CitaMedica.Service.MedicoService; import com.main.CitaMedica.Service.PacienteService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.Date; import java.util.List; @RestController @RequestMapping("/citas") public class CitaController { @Autowired CitaService citaService; @Autowired MedicoService medicoService; @Autowired PacienteService pacienteService; @GetMapping("mostrarTodos") public ResponseEntity<CitaDTO> showCitas(){ List<CitaDTO> citas = citaService.findAll(); return new ResponseEntity(citas, HttpStatus.OK); } @GetMapping("mostrarUno/{citaID}") public ResponseEntity<CitaDTO> showCita(@PathVariable("citaID") int citaID){ CitaDTO cita = citaService.findById(citaID); return new ResponseEntity(cita,HttpStatus.OK); } /* @GetMapping("mostrar/porFecha/{fecha}") public ResponseEntity<Cita> showCitaFechaHora(@PathVariable("fecha")Date fecha){ List<Cita> cita = citaService.findByFechaHora(fecha); return new ResponseEntity(cita,HttpStatus.OK); } */ @PostMapping("create") public ResponseEntity<CitaDTO> crearCita(){ MedicoDTO medico = medicoService.findById(5); PacienteDTO paciente = pacienteService.findById(3); CitaDTO cita = new CitaDTO(); cita.setMedico(medico); cita.setPaciente(paciente); cita.setFechaHora(new Date()); cita.setMotivoCita("Prueba"); citaService.save(cita); return new ResponseEntity(HttpStatus.OK); } @PutMapping("update/{citaID}") public ResponseEntity<CitaDTO> actualizarCita(@PathVariable("citaID") int citaID){ CitaDTO cita = citaService.findById(citaID); cita.setMotivoCita("Enfermedad"); citaService.save(cita); return new ResponseEntity(HttpStatus.OK); } @DeleteMapping("delete/{citaID}") public ResponseEntity<CitaDTO> delete(@PathVariable("citaID") int citaID){ citaService.delete(citaID); return new ResponseEntity(HttpStatus.OK); } }
排查建议
- 检查组件扫描范围:确认DTO、Service、Mapper所在包是否在Spring Boot自动扫描范围内。默认扫描启动类所在包及其子包,若不在需在启动类添加
@ComponentScan(basePackages = {"com.main.CitaMedica"})指定路径。 - 验证Mapper配置:如果使用MyBatis等框架,确保Mapper接口添加了
@Mapper注解,或启动类添加@MapperScan指定Mapper所在包。配置错误会导致Service依赖注入失败,控制器无法初始化。 - 检查DTO结构:DTO类必须有公共无参构造函数,所有需要序列化的字段要有getter/setter方法。缺失这些会导致JSON序列化失败,引发控制器初始化异常。
- 查看服务器日志:重点排查启动时是否有Bean创建失败的异常(比如Service注入失败)。若控制器未被Spring管理,对应的路由不会注册,直接返回404。
- 统一路由路径格式:建议将
@GetMapping("mostrarTodos")改为@GetMapping("/mostrarTodos"),明确路径分隔符,避免拼接歧义。 - 排查依赖冲突:引入DTO和Mapper相关依赖后,检查是否存在Jackson等序列化框架的版本冲突。可通过Maven/Gradle依赖树分析并排除冲突依赖。
内容的提问来源于stack exchange,提问作者Miguel Ángel
相关产品推荐
相关产品推荐

