【问题标题】:404 on jQuery AJAX request in Spring bootSpring boot 中 jQuery AJAX 请求上的 404
【发布时间】:2025-12-23 09:05:11
【问题描述】:

我最近创建了一个 Spring 启动项目,并尝试使用 jQuery AJAX 从 Spring 中的 Controller 获取数据。由于某种原因,它返回 404。

我的控制器

import java.util.ArrayList;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @RequestMapping(value="/", method=RequestMethod.GET)
    public String loadHome() {
        return "index";
    }

    @RequestMapping(value="/getMajors", method=RequestMethod.GET)
    public ArrayList<String> getMajors(){
        ArrayList<String> majors = new ArrayList<>();
        majors.add("Computers");
        majors.add("Physics");
        return majors;
    }

}

第一种方法是加载主页index.html第二种方法是映射到AJAX请求的方法。

我的 jQuery AJAX 请求

$.ajax({
    type:"get",
    url:"/getMajors",
    success:function(data){
        console.log(data);
    },
    error:function(data){
        console.log(data);
    }
});

请告诉我为什么我会在这里收到 404。 TIA。

编辑:这个应用是在 Springboot 中创建的。带有 web、开发工具包的标准配置 - 来自 spring 初始化程序。

【问题讨论】:

  • 你实现了 server.context 吗?
  • 如果你在浏览器中点击localhost:8080/getMajors,你能得到回复吗?

标签: java jquery ajax spring spring-boot


【解决方案1】:

我猜你错过了两件事。一个是上下文名称,通常是项目的名称或部署到服务器的 war 文件,除非您在 web.xml 中提供另一个上下文。来自 web.xml 文件的示例 servlet 映射:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

因此,当您的 ajax 调用命中 /getMajors 时,它通常指向 "localhost:port/getMajors" 而不是说 "localhost:port/sampleproj/getMajors" 。您缺少那里的上下文。

所以你的方法需要如下所示:

@RequestMapping(value = "/getMajors", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ArrayList<String> getMajors(){
        ArrayList<String> majors = new ArrayList<>();
        majors.add("Computers");
        majors.add("Physics");
        return majors;
}

调试这些的一个好方法是查看开发者控制台 (Chrome) 以获取请求响应信息。

编码愉快!

编辑 1:从方法中删除 @ResponseBody,因为该类使用 @RestController 进行了注释。但是如果类被@Controller注解,我的说法是正确的。

【讨论】:

  • 如果你的类被注释为@RestController,你不需要@ResponseBody。你可以返回你想要的每一个数据类型,它不能是字符串。如果你真的实现了,你只需要一个上下文。
  • @Patrick 是对的,我使用RestController 的原因是为了删除ResponseBody-s 的附加声明
  • 好的。我想我忽略了 RestController 注释。将相应地修改答案。但即便如此,我认为上下文映射仍然很重要。 @Kalyan 你检查了吗?
【解决方案2】:

由于你只是想返回一个数据列表,所以你需要使用@ResponseBody让它只返回数据列表,改变你的代码如下:

   @RequestMapping(value="/getMajors", method=RequestMethod.GET)
   @ResponseBody
   public ArrayList<String> getMajors(){
        ArrayList<String> majors = new ArrayList<>();
        majors.add("Computers");
        majors.add("Physics");
        return majors;
    }

另外,你需要注意 ajax get 方法缓存

【讨论】:

  • 我已经添加并尝试了。又是 404 :(
  • 如果您还没有这样做,请检查您的上下文路径。如果 '/' 加载,请使用您的浏览器开发工具将 '/' 请求与 '/getMajors' ajax 请求进行比较,并确保路径看起来正确。
  • @KalyanChavali 把你的代码的整个配置添加进去,方便其他人分析,也请检查getMajors()方法是否被调用。
  • HomeController 类被注释为@RestController。所以@ResponseBody 在每个方法上都隐含注释
  • @Patrick 那么它是如何通过ModelAndView 知道用户是想返回一个页面还是只是一个纯数据?