如何一起使用@RequestBody和@RequestParam

时间:2018-08-19 11:20:32

标签: java spring spring-mvc spring-boot

我正在尝试同时使用@RequestBody@RequestParam通过Postman发送JSON和多个文件,但是它不起作用。是否可以在API中同时使用两个注释?

@RequestMapping(value = "/save/product/test", method = RequestMethod.POST)
public ResponseEntity<?> save(@Valid @RequestBody ProductVo productVo, @RequestParam("files") @NotNull @NotBlank MultipartFile[] uploadfiles) {

    System.out.println("body " + productVo.toString());
    for (MultipartFile file :  uploadfiles) {
        System.out.println(file.getOriginalFilename());
        System.out.println(file.getContentType());
        System.out.println(file.getName());
        System.out.println(file.getSize());

    }
    return new ResponseEntity<APIResponse>(this.apiResponse, HttpStatus.NO_CONTENT);
}

3 个答案:

答案 0 :(得分:2)

@RequestParam从uri获取参数,您实际上是在尝试实现其他目标。

这是一个示例控制器,它接收json主体和多部分文件:

@RestController
@RequestMapping("/users")
public class UserController {

    UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping({"/", ""})
    public ResponseEntity<User> post(@RequestPart("request") UserCreateRequest request, @RequestPart("file") MultipartFile file) throws IOException {

        String photoPath = UUID.randomUUID() + file.getOriginalFilename().replaceAll(" ", "").trim();

        // other logic

        return ResponseEntity.ok(userService.create(request));
    }
}

答案 1 :(得分:1)

您可以通过将多部分包装在其他字段旁边来减轻生活负担:

  class UploadContext {

    private MultipartFile file;
    private UserCreateRequest request;
    // other fields
 }

并在控制器中使用此对象:

    @PostMapping(value = "/upload")
    public void upload(UploadContext context) {
        // controller logic here
    }

文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-multipart-forms

在客户代码中,您必须清除标题中的内容类型:

     headers: {'Content-Type': undefined}

希望这会有所帮助。

答案 2 :(得分:0)

通过拥有MultipartHttpServletRequestRequestParam可以上传任何数量的文件和字符串参数。

要注意的一件事:MultipartHttpServletRequest也将保留所有请求参数,因此从技术上讲,您甚至可以只拥有MultipartHttpServletRequest并对其进行解析

控制器的签名为:

public ResponseEntity<BulkUploadResponsePayload> filesAndJson(
            @ApiParam(hidden = true) MultipartHttpServletRequest multipartRequest,
            @RequestParam(value = "json-param",name = "json-param") String documentType) {
     // multipartRequest will have all the files
     // you can use json-param for any string
}