springmvc的RequestPartMethodArgumentResolver解析_晏无心_新浪博客
先来看supportsParameter()方法:
支持添加了@RequestPart注解的参数,还可以支持Multipart文件上传的参数类型。
PS:ArgumentResolver在初始化时有一个默认的顺序,如果多个ArgumentResolver可以解析某一种类型,以顺序在前面的先解析。RequestParamMethodArgumentResolver同样可以对Multipart文件上传进行解析,并且默认顺序在RequestPartMethodArgumentResolver之前,所以如果不添加@RequestPart注解,Multipart类型的参数会被RequestParamMethodArgumentResolver解析。
再来看resolveArgument()方法:
首先会尝试使用MultipartResolutionDelegate进行解析,如果参数类型是Multipart,就从消息体中获取返回MultipartFile;如果参数不是Multipart类型,就使用MessageConverters对参数进行转换绑定。
来看具体的handler:
@RequestPart注解标注的参数,必须有httpHeaders,如果httpHeaders为空,将会报异常。如果页面直接使用form表单提交,使用@RequestPart注解标注的非文件类型参数是会报错的,因为此时的参数httpHeaders为空。如果是form表单提交,应该使用@RequestParam注解:
@RequestParam注解和@RequestPart注解都有对应的ArgumentResolver可以对文件上传进行处理,它们的区别在于非文件上传类型参数的处理上。@RequestParam只能处理字符串类型的参数,因为它获取参数的值是简单的从request.getParameter()中获取,无法获取http消息体中复杂的数据类型(json、xml、image等);@RequestPart既可以处理字符串,也可以处理http请求消息体中复杂的数据类型,它是使用MessageConverters进行解析转换,但要求httpHeaders不能为空。
RequestPartMethodArgumentResolver主要用于http请求中有多个复杂参数类型的解析处理。
还没有评论,来说两句吧...