com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.w.model.response.Response` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator

这玩意是我 Response 没写无参构造器造成的。

你的问题是,你想在前端发送一个 post 请求,参数中包含一个文件和一些其他的属性,你想让后端能够接收到这些参数,并且封装成一个对象。为了实现这个目的,你需要做两件事:

  • 一是在前端,使用 FormData 对象来构造请求的 data 参数,并设置 Content-Type 为 multipart/form-data。FormData 对象可以让你将文件和其他属性一起发送给后端,而 multipart/form-data 是一种数据格式,它可以让后端知道你的请求中有多个部分,每个部分都有一个边界(boundary)来分隔。
  • 二是在后端,使用 @RequestPart 和 @RequestParam 注解来分别接收文件和其他属性,并且创建一个对象,并将参数赋值给它。@RequestPart 注解可以让后端知道你的文件是一个请求的一部分,而 @RequestParam 注解可以让后端知道你的其他属性是请求的参数。

现在,我已经给你写好了前端和后端的示例代码,你只需要复制粘贴到你的项目中,并且根据你的实际情况修改一些变量名或值就可以了。你不需要自己写什么值,只需要按照我给你的代码格式来就可以了。请看下面的代码:

// 前端发送请求的示例
let data = new FormData();
data.append('file', file); //file 是一个文件对象
data.append('name', 'Alice');
data.append('age', 18);
let config = {
  headers: {
    'Content-Type': `multipart/form-data; boundary=${data._boundary}`
  }
};
request('http://localhost:9090/activity/apply/before', METHOD.POST, data, config);

复制

// 后端接收参数的方法
@PostMapping(value = "/apply/before", consumes = "multipart/form-data")
public Response applyBefore(@RequestPart("file") MultipartFile file, @RequestParam("name") String name, @RequestParam("age") Integer age) {
  // 处理 file, name, age 参数
  // 创建一个 BeforeVo 对象,并将参数赋值给它
  BeforeVo beforeVo = new BeforeVo();
  beforeVo.setFile(file);
  beforeVo.setName(name);
  beforeVo.setAge(age);
  // 调用 activityService.applyBefore 方法
  if (activityService.applyBefore(beforeVo)) {
    return ResponseUtils.success("提交成功!");
  } else {
    return ResponseUtils.fail("提交失败!");
  }
}

复制希望这能帮助你理解和解决问题。如果你还有什么疑问或困难,请随时告诉我。