Spring控制器中多部分文件的@RequestParam和@RequestPart之间有什么实际区别?

问题描述 投票:0回答:1

Spring 文档指出 @RequestParam 依赖于通过注册的 Converter 或 PropertyEditor 进行类型转换,而 @RequestPart 依赖于 HttpMessageConverters,同时考虑请求部分的“Content-Type”标头

  1. 现在,如果所有配置都保留默认值,两者之间的实际差异是什么
  2. 如果我上传 JSON/XML 文件并使用 @RequestParam 或 @RequestPart 有什么区别?
java spring spring-boot spring-mvc multipartfile
1个回答
0
投票

@RequestParam

  • 最适合直接的表单数据提交,您可以在其中上传文件以及其他简单的表单字段。 (例如,字符串、整数)。

  • 将简单的名称-值对转换为方法参数。依赖于通过注册的转换器或 PropertyEditor 进行类型转换。

  • @RequestParam 需要简单的字符串或表单编码的数据。它无法正确解析复杂的 JSON 结构或将其转换为 Java 对象。我们需要为它们编写自定义逻辑

     @PostMapping("/upload2")
     public ResponseEntity<String> submitData(
          @RequestParam("file") MultipartFile file,
          @RequestParam("metadata") String metadata) {
      try {
          // Convert JSON string to MyObject
          ObjectMapper objectMapper = new ObjectMapper();
          Metadata myObject = objectMapper.readValue(metadata, Metadata.class);
    
          // Use the parsed object
          System.out.println("Key1: " + myObject.getKey1());
          System.out.println("Key2: " + myObject.getKey2());
    
          return ResponseEntity.ok("Data received");
      } catch (Exception e) {
          e.printStackTrace();
          return ResponseEntity.badRequest().body("Error processing data");
      }
    

@RequestPart

  • 当您的请求包含复杂部分时,例如需要单独解析的文件和 JSON 负载。 (例如 JSON 数据)。

  • 处理更复杂的内容,例如 JSON 或 XML。使用HttpMessageConverters根据Content-Type转换请求部分。这可以将 JSON 映射到非多部分请求中的 Java 对象。

    @PostMapping(path = "/upload1", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResponseEntity<String> uploadComplex(
           @RequestPart("file") MultipartFile file,
          @RequestPart("metadata") Metadata metadata) {
      // Use the parsed Metadata object
      System.out.println("Key1: " + metadata.getKey1());
      System.out.println("Key2: " + metadata.getKey2());
    
      return ResponseEntity.ok("File and metadata uploaded");
     }
    }
    

sample postman request

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestPart.html

© www.soinside.com 2019 - 2024. All rights reserved.