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

SpringBoot MVC服务404错误排查:无法进入JSON返回方法

问题描述

最近两周开发的Web应用,测试时始终无法进入返回JSON对象列表的控制器方法。已引入Jackson、Spring Boot Web、Tomcat、Data-JPA、Hibernate、MySQL及JSP访问依赖,index.jsp可正常显示,但目标方法未被触发。自行排查数日,尝试过Spring类断点调试、修改application.properties上下文配置等手段均无效,已将代码简化至最简形式。

相关代码

控制器代码

package net.draconia.schedule.controllers;

import java.util.List;

import net.draconia.schedule.beans.Event;

import net.draconia.schedule.dao.EventDAO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class ScheduleController
{
    private static final Logger logger = LoggerFactory.getLogger(ScheduleController.class);
    
    @Autowired
    private EventDAO mObjDAO;
    
    protected EventDAO getDAO()
    {
        return(mObjDAO);
    }
    
    //@GetMapping("/events")
    @RequestMapping(value = "events", method = RequestMethod.GET)
    public @ResponseBody List<Event> getEvents()
    {
        logger.debug("I got here");
        
        return(getDAO().getList());
    }
    
    @GetMapping("/")
    public String index()
    {
        return("index");
    }
}

DAO接口代码

package net.draconia.schedule.dao;

import java.util.List;

import javax.persistence.EntityNotFoundException;

import net.draconia.schedule.beans.Event;

public interface EventDAO
{
    public Event getEventById(final long lId) throws EntityNotFoundException;
    public List<Event> getList();
    public void remove(final Event objEvent);
    public void removeById(final long lId);
    public Event save(final Event objEvent);
}

application.properties配置

spring.datasource.url = jdbc:mysql://localhost:3306/schedule
spring.datasource.username = root
spring.datasource.password = R3g1n@ M1lL$ 1$ My Qu3eN!
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
server.servlet.contextPath=/scheduler

启动类代码

package net.draconia.schedule;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@SpringBootApplication(scanBasePackages = {"net.draconia.schedule.controller"})
public class ScheduleApp implements WebMvcConfigurer
{
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder)
    {
        return(builder.sources(ScheduleApp.class));
    }
    
    public static void main(String[] args)
    {
        SpringApplication.run(ScheduleApp.class, args);
    }
}
排查思路与解决方法
  1. 修正包扫描范围
    启动类@SpringBootApplication的scanBasePackages配置为net.draconia.schedule.controller,但控制器实际在net.draconia.schedule.controllers(复数包名)下,导致Spring无法扫描到该控制器。修改扫描路径为net.draconia.schedule或net.draconia.schedule.controllers即可。

  2. 确认请求路径正确性
    结合server.servlet.contextPath=/scheduler,/events接口的完整请求路径应为http://localhost:8080/scheduler/events。建议给控制器路径添加斜杠,写成@RequestMapping(value = "/events"),避免路径匹配歧义。

  3. 补全DAO实现类
    仅定义EventDAO接口但无实现类,且未通过@Repository注解标记,Spring无法自动注入该Bean。需编写EventDAOImpl实现类,添加@Repository注解,并确保实现类所在包被Spring扫描到。

  4. 确保Event类可序列化
    Jackson序列化需要:

    • Event类提供无参构造函数
    • 所有属性添加getter方法
    • 可按需添加@JsonProperty注解明确字段映射
  5. 调整日志级别
    当前使用logger.debug输出,若未开启DEBUG级别日志将无法看到输出。在application.properties中添加logging.level.net.draconia.schedule.controllers=DEBUG,确认方法是否被调用。

内容的提问来源于stack exchange,提问作者Seth D. Fulmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:33:23