You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:31:23