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); } }
修正包扫描范围
启动类@SpringBootApplication的scanBasePackages配置为net.draconia.schedule.controller,但控制器实际在net.draconia.schedule.controllers(复数包名)下,导致Spring无法扫描到该控制器。修改扫描路径为net.draconia.schedule或net.draconia.schedule.controllers即可。确认请求路径正确性
结合server.servlet.contextPath=/scheduler,/events接口的完整请求路径应为http://localhost:8080/scheduler/events。建议给控制器路径添加斜杠,写成@RequestMapping(value = "/events"),避免路径匹配歧义。补全DAO实现类
仅定义EventDAO接口但无实现类,且未通过@Repository注解标记,Spring无法自动注入该Bean。需编写EventDAOImpl实现类,添加@Repository注解,并确保实现类所在包被Spring扫描到。确保Event类可序列化
Jackson序列化需要:- Event类提供无参构造函数
- 所有属性添加getter方法
- 可按需添加
@JsonProperty注解明确字段映射
调整日志级别
当前使用logger.debug输出,若未开启DEBUG级别日志将无法看到输出。在application.properties中添加logging.level.net.draconia.schedule.controllers=DEBUG,确认方法是否被调用。
内容的提问来源于stack exchange,提问作者Seth D. Fulmer

