我们可以在春天一起使用多部分和@RequestBody吗?

我想创建一个API,它可以将参数作为多部分文件和JSON对象(@RequestBody)。请在调用此 API 时找到以下代码段。我收到 HTTP 415 不支持的媒体类型错误。如果我删除,那么它工作正常。@RequestBody LabPatientInfo reportData

@RequestMapping(value={"/lab/saveReport"}, method={RequestMethod.POST}, 
                consumes={"multipart/form-data"}, headers={"Accept=application/json"})
@ResponseBody
public ResponseEntity<String>
saveReport(@RequestParam(value="reportFile") MultipartFile reportFile,
           @RequestBody LabPatientInfo reportData) throws IOException {
    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json; charset=utf-8");
    logger.info("in Lab Save Report");
    logger.info("Report Data {} ", reportData);
    //logger.info("Request BODY {} ", request.getAttribute("data"));
    return new ResponseEntity<String>(HttpStatus.OK);
}

以下是LabPatientInfo类。

@RooJson(deepSerialize = true)
@RooToString
public class LabPatientInfo {
    
    private String firstName;
    private String phoneNumber;
    private String DateOfBirth;
    private Integer age;
    private String gender;
    private String refferedBy; 
    private String reportfile;
    private String reportType;
    private String reportDate;
    private String purpose;
    private String followUpDate;
    private List<ReportDataInfo> analytes;

在点击API时,我正在通过上传的文件传递以下JSON对象。

{
    "firstName":"abc",
    "phoneNumber":"898989",
    "DateOfBirth":"asas",
    "age":"asas",
    "gender":"asas",
    "refferedBy":"asas",
    "reportfile":"asas",
    "reportType":"asas",
    "reportDate":"asas",
    "purpose":"asas",
    "followUpDate":"asas",
    "analytes":null
}

答案 1

您可以像下面这样使用。这将同时支持 json 对象和多部分文件。@RequestPart

@ResponseBody
public ResponseEntity<String>
saveReport(@RequestPart (value="reportFile") MultipartFile reportFile,
           @RequestPart LabPatientInfo reportData) throws IOException {

为了使用 curl 对其进行测试您可以为 json 部分(reportData)创建一个文件。例如,您创建了“mydata.json”文件,并将json有效负载粘贴到其中。并假设您的 reportFile 是“report.txt”。现在,您可以使用如下所示的curl发送请求。

curl -v -H "Content-Type:multipart/form-data" -F "reportData=@mydata.json;type=application/json" -F "reportFile=@report.txt;type=text/plain"  http://localhost:8080/MyApp/lab/saveReport

答案 2

接收 json 对象和通用文件的 post 方法的示例:

public ResponseEntity<Resource> postGenerateReport(@RequestPart GenerateReportDTO, generateReportDTO, @RequestPart MultipartFile jxhtmlReport)

对于PostMan设置(或curl或任何其他REST测试实用程序),您只需要添加具有2个元素的表单数据请求:

  1. Key:generateReportDTO扩展名为 .json 的文件(以及与对象兼容的内容)Value:
  2. Key:jxhtmlReport,只是任何文件。Value:

咕噜咕噜


推荐