将文件和 JSON 数据发布到 Spring REST 服务
Posted
技术标签:
【中文标题】将文件和 JSON 数据发布到 Spring REST 服务【英文标题】:Posting a file and JSON data to Spring rest service 【发布时间】:2016-02-17 05:02:02 【问题描述】:我正在构建一个用于上传文件的 Spring 休息服务。有一个表单,由各种字段和一个用于上传文件的字段组成。在提交该表单时,我将发送一个多部分表单请求,即 Content-Type
为 multipart/form-data
。
所以我在下面尝试了
@RequestMapping(value = "/companies", method = RequestMethod.POST)
public void createCompany(@RequestBody CompanyDTO companyDTO, @RequestParam(value = "image", required = false) MultipartFile image)
.................
但是,上面没有工作。因此,暂时,我将 JSON 数据作为字符串发送,并在休息服务中从该字符串形成公司对象,如
@RequestMapping(value = "/companies", method = RequestMethod.POST)
public void createCompany(@RequestParam("companyJson") String companyJson, @RequestParam(value = "image",required = false) MultipartFile image) throws JsonParseException, JsonMappingException, IOException
CompanyDTO companyDTO = new ObjectMapper().readValue(companyJson, CompanyDTO.class);
.............................
如果不将 JSON 作为字符串传递,我不能使用 @RequestBody 发送 JSON 数据吗?
【问题讨论】:
可能与***.com/questions/4083702/…重复 另见***.com/questions/15502054/… 问题是@RequestBody
,见***.com/questions/29370143/…
没有@RequestBody,对象字段不会被映射,即DTO的字段被设置为null
【参考方案1】:
使用 @RequestParam 将值附加到您现在所做的 URL。
@RequestParam 注释不适用于复杂的 JSON 对象,它是为 Integer 或 String 指定的。
如果是 Http POST 方法,使用 @RequestBody 将使 Spring 将传入的请求映射到你创建的 POJO(条件:如果 POJO 映射传入的 JSON)
【讨论】:
多部分请求用于处理文件,不需要的时候可以跳过【参考方案2】:创建 FormData() 并附加您的 json 和文件
if (form.validate())
var file = $scope.file;
var fd = new FormData();
fd.append('jsondata', $scope.jsonData);
fd.append('file', file);
MyService.submitFormWithFile('doc/store.html', fd, '', (response)
console.log(response)
);
//上面调用的服务
MyService.submitFormWithFile = function(url, data, config, callback)
$http(
method : 'POST',
url : url,
headers :
'Content-Type' : undefined
,
data : data,
transformRequest : function(data, headersGetterFunction)
return data;
).success(function(response, status, header, config)
if (status === 200)
callback(response);
else
console.log("error")
).error(function(response, status, header, config)
console.log(response);
);
;
//在你的java部分中使用ObjectMapper
//it is like string
fd.append('jsondata', JSON.stringify($scope.jsonData));
@Autowired
private ObjectMapper mapper;
@RequestMapping(value = "/companies", method = RequestMethod.POST)
public void createCompany(@RequestParam String jsondata,
@RequestParam(required = true) MultipartFile file)
CompanyDto companyDto=mapper.readValue(jsondata, CompanyDTO.class);
......
【讨论】:
【参考方案3】:使用下面的代码sn-p:
@RequestMapping(value= "/path", method=RequestMethod.POST, produces=MediaType.APPLICATION_JSON_VALUE)
public ResponseObject methodName(MyData input, @RequestParam(required=false) MultipartFile file)
// To Do
【讨论】:
以上是关于将文件和 JSON 数据发布到 Spring REST 服务的主要内容,如果未能解决你的问题,请参考以下文章
如何从(.js)文件发送ajax请求到Spring MVC Controller?
Spring Boot 控制器 - 将 Multipart 和 JSON 上传到 DTO
从 20 个相关表中获取数据(通过 id),将它们组合到一个 json 文件并为此利用 spring 批处理