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

Java Controller接口编写及Ajax调用相关技术咨询

Ajax调用Spring MVC接口的实现与问题排查

我来帮你梳理下用Ajax调用这个Spring MVC接口的关键点和常见问题,先从你的代码和调用实现两方面说起:

你的Controller代码分析

首先看你提供的Controller代码,这里有个容易踩坑的地方需要注意:

@Controller
public class Controller1 {
    //....
    @RequestMapping(value = "/demo/web/rest/post/create/bim/project", method = RequestMethod.POST)
    public @ResponseBody Long createProject(@ModelAttribute UploadDescriptionFileDemo file, BindingResult result) {
        // 这里的字符串比较方式不正确!
        if (file.getName().trim() != "") {
            if (result != null) file.setBindingResult(result);
            Long res = createProjectDemoSA.createProject(file);
            return res;
        } else {
            return EMPTY_NAME;
        }
    }
}

注意:Java中判断字符串是否为空不能用!= "",因为这是比较对象引用而非内容。正确的写法应该是!file.getName().trim().isEmpty()或者!"".equals(file.getName().trim()),避免出现逻辑判断错误。

正确的Ajax调用示例

因为你的接口接收包含文件的表单数据,所以必须使用FormData来构造请求参数,下面给出两种常见的Ajax实现方式:

原生JavaScript Ajax实现

// 构造FormData对象,假设页面上有id为projectName的输入框和projectFile的文件上传框
const formData = new FormData();
formData.append("name", document.getElementById("projectName").value.trim());
formData.append("file", document.getElementById("projectFile").files[0]);

const xhr = new XMLHttpRequest();
xhr.open("POST", "/demo/web/rest/post/create/bim/project", true);
// 标记为Ajax请求,方便后端识别
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

xhr.onload = function() {
    if (xhr.status >= 200 && xhr.status < 300) {
        const projectId = parseInt(xhr.responseText);
        console.log("项目创建成功,ID:", projectId);
        // 这里添加你的成功处理逻辑,比如提示用户、跳转页面等
    } else {
        console.error("请求失败,状态码:", xhr.status);
        // 处理错误情况,比如提示用户创建失败
    }
};

xhr.send(formData);

jQuery Ajax实现

如果你用jQuery开发,代码会更简洁一些:

const formData = new FormData();
formData.append("name", $("#projectName").val().trim());
formData.append("file", $("#projectFile")[0].files[0]);

$.ajax({
    url: "/demo/web/rest/post/create/bim/project",
    type: "POST",
    data: formData,
    // 这两个参数必须设置为false,否则jQuery会错误处理FormData
    processData: false,
    contentType: false,
    headers: {
        "X-Requested-With": "XMLHttpRequest"
    },
    success: function(projectId) {
        console.log("项目创建成功,ID:", projectId);
        // 成功逻辑处理
    },
    error: function(xhr, status, error) {
        console.error("创建失败:", error);
        // 错误逻辑处理
    }
});

常见问题排查指南

  • 文件上传失败:确保你正确使用了FormData,并且没有手动设置Content-Type为multipart/form-data——浏览器会自动为FormData添加正确的Content-Type(包含boundary参数),手动设置反而会导致解析失败。
  • 参数绑定失败:检查UploadDescriptionFileDemo类的属性名是否和FormData中append的键名一致(比如name对应类中的name属性),同时确保类有对应的getter/setter方法。
  • BindingResult无效:BindingResult必须紧跟在@ModelAttribute修饰的参数后面,否则Spring无法将校验结果绑定到它上面,你的代码当前位置是正确的,后续添加参数时要注意顺序。
  • 跨域问题:如果前端页面和后端服务不在同一域名下,需要在Controller类上添加@CrossOrigin注解,或者在Spring配置中设置全局跨域规则。
  • 空字符串判断错误:前面提到的字符串比较问题一定要修正,否则可能出现明明输入了名称却返回EMPTY_NAME的情况。

内容的提问来源于stack exchange,提问作者Fenny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:43:32