【问题标题】:Posting a file and JSON data to Spring rest service将文件和 JSON 数据发布到 Spring REST 服务
【发布时间】:2016-02-17 05:02:02
【问题描述】:

我正在构建一个用于上传文件的 Spring 休息服务。有一个表单,由各种字段和一个用于上传文件的字段组成。在提交该表单时,我将发送一个多部分表单请求,即 Content-Typemultipart/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 数据吗?

【问题讨论】:

标签: java json spring rest multipartform-data


【解决方案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
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多