提问者:小点点

将多部分表单数据映射到对象


我必须编写一个使用multipart/form-data的REST API。 当我编写如下方法时,它工作得很好

@RequestMapping(value="/addSftp", method=RequestMethod.POST)
public HashMap<String, Object> welcome( HttpServletRequest request,@RequestParam(value="selectedFile", required=false) MultipartFile selectedFile,
        @RequestParam(value="sftp_name") String sftp_name,
        @RequestParam(value="ip_address")String ip_address,
        @RequestParam(value="port_number")String port_number,
        @RequestParam(value="userName")String userName,
        @RequestParam(value="password")String password,
        @RequestParam(value="customRadioInline1")String customRadioInline1) {
    HashMap map = new HashMap<String, Object>();
    System.out.println(sftp_name);
    System.out.println(ip_address);
    System.out.println(port_number);
    System.out.println(userName);
    System.out.println(password);
    System.out.println(customRadioInline1);
    System.out.println(selectedFile);
    map.put("stat", "success");
     return map;
              }

我想把请求映射到一个bean。 下面是我的豆子

public class SftpBean {

    private String sftp_name;
    private String ip_address; 
    private String port_number;
    private String userName;
    private String password;
    private String customRadioInline1;
    private MultipartFile selectedFile;

//getters and setters here

}

但是当我编写如下方法时,我得到了异常

public HashMap<String, Object> welcome( @RequestBody SftpBean sftpBean) {
    HashMap map = new HashMap<String, Object>();
    System.out.println(sftpBean.getIpAddress());
    //similar statements for priniting other parameters
    map.put("stat", "success");
     return map;
}

这是我的例外

Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: 
    Content type 'multipart/form-data;boundary=---------------------------246741595337214313524058968681;charset=UTF-8' not supported]

这是我的请求负载

-----------------------------317042354532732980343175029806
Content-Disposition: form-data; name="sftp_name"

ABC
-----------------------------317042354532732980343175029806
Content-Disposition: form-data; name="ip_address"

123
-----------------------------317042354532732980343175029806
Content-Disposition: form-data; name="port_number"

456
-----------------------------317042354532732980343175029806
Content-Disposition: form-data; name="userName"

demo
-----------------------------317042354532732980343175029806
Content-Disposition: form-data; name="password"

demo123
-----------------------------317042354532732980343175029806
Content-Disposition: form-data; name="customRadioInline1"

pwd
-----------------------------317042354532732980343175029806
Content-Disposition: form-data; name="selectedFile"; filename="details.txt"
Content-Type: text/plain

有没有一种方法可以直接将请求映射到我的SFTPBean


共2个答案

匿名用户

您需要在@requestmapping内添加@consumesconsumes=,以指定服务器端可接受的内容类型。 如果您发送的是多部分表单数据,则可以使用mediatype.multipart_form_data(如果您将请求作为多部分表单发送)。 但是,如果要将其封装到一个对象中并将其作为json发送,则需要使用mediatype.application_JSON。 还要确保从使用RestController的客户端发送正确的格式。 在创建REST请求时,您需要在客户端将有效负载从multipart表单更改为json格式。 修改后的方法只需要一个json对象SFTPBean,而这个对象在您的负载中根本找不到。

匿名用户

您可以为要发送的主体创建一个RequestPart以及MultipartFile

下面是我的做法:

@PostMapping("/hello/upload")
public SftpBean upload(@RequestParam("file") MultipartFile file,
                      @RequestPart("body") SftpBean sftpBean) {
    return sftpBean;
}

Pojo保持不变。