我正在构建一个Spring rest服务来上传文件。有一个表单由各种字段和一个字段组成,用于上传文件。在提交该表单时,我发送的是多部分表单请求,即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作为String传递的情况下使用@RequestBody发送JSON数据吗?
答案 0 :(得分:0)
使用@RequestParam将值添加到URL中。
@RequestParam注释不适用于复杂的JSON对象,它是Integer或String的指定。
如果是Http POST方法,使用@RequestBody将使Spring将传入的请求映射到您创建的POJO(条件:如果POJO映射传入的JSON)
答案 1 :(得分:0)
创建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);
});
};
//使用ObjectMapper
在java部分中//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);
......
}
答案 2 :(得分:0)
使用以下代码段:
@RequestMapping(value= "/path", method=RequestMethod.POST, produces=MediaType.APPLICATION_JSON_VALUE)
public ResponseObject methodName(MyData input, @RequestParam(required=false) MultipartFile file) {
// To Do
}