Spring Boot HandlerMethodArgumentResolver 使用和场景
在 Spring Boot 中,HandlerMethodArgumentResolver
是一个非常有用的接口,它可以帮助我们在处理请求时将请求参数转换为方法参数。
# 使用方式
要使用 HandlerMethodArgumentResolver,需要遵循以下步骤:
1、创建一个自定义的 HandlerMethodArgumentResolver 实现类。
2、在该类中实现 supportsParameter() 方法和 resolveArgument() 方法。
3、在 Spring Boot 应用程序中注册该类。
# 使用示例
@GetMapping("test")
public void test(@RequestHeader("token")String token){
User user=userService.getByToken(token);
}
1
2
3
4
5
2
3
4
5
上面的代码片段,就是从token中获取用户信息,每个接口都这样获取,显得很麻烦,我们可以使用HandlerMethodArgumentResolver做下优化。
# 定义注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserInfo {
}
1
2
3
4
5
6
2
3
4
5
6
# 创建自定义的 HandlerMethodArgumentResolver 实现类
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(UserInfo.class);
}
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
String token = request.getHeader("token");
//业务方法
return userService.getByToken(token);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 注册解析器
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{
@Autowired
UserArgumentResolver userArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 控制类
@RequestMapping("/test")
public String list(@UserInfo TeamartUser user) {
System.out.println(user);
}
1
2
3
4
2
3
4
# 总结
HandlerMethodArgumentResolver 解析器有很多应用场景,比如对于前端传参解密、参数转换等。
上次更新: 2024/08/12, 14:38:19