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
相关产品推荐
相关产品推荐

