SpringBoot让你的Bean动起来(自定义参数解析HandlerMethodArgumentResolver)
简介
我们 Controller
用到的一些 Bean
需要通过一定的方式去获取的,可以通过注入方式获取其他获取方式进行获取。
比如:需要用到用户实例,我们通常做法为下
@Resource
private UserService userService;
@GetMapping("getUserByUsername")
public String getUserByUsername(HttpServletRequest request) {
...
AuthUser user = userService.getUserByUsername("小明");
...
}
这样是一般的做法,我们可以发现 HttpServletRequest
可以通过注入方式加载,也可以直接在 public String getUserByUsername()
方法参数获取到。
这样的方式 也把我们的 User
对象封装到方法参数里。
当我们执行 Controller
就会有一个对应用户的对象存在了。
功能使用
自定义 UserArgumentResolver
这里我们需要使用到一个 HandlerMethodArgumentResolver
接口。
自定义 UserArgumentResolver
处理 User
。
/**
* 封装 参数方式获取 {@link AuthUser} 对象
*
* @author purgeyao
* @since 1.0
*/
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
Class<?> aClass = methodParameter.getParameterType();
// 判断是否为 AuthUser 类
return aClass == AuthUser.class;
}
@Override
public Object resolveArgument(MethodParameter methodParameter,
ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest,
WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
// 获取参数
String name = request.getParameter("name");
// TODO 获取对应的用户对象 查询操作
AuthUser user = userService.getUserByUsername(name);
return user;
}
}
上述代码会在执行 Controller
之前处理。通过获取请求头 或者 请求里的参数(具体看自己的业务)。
执行相应的对象查询操作。接下来就可以在 Controller
参数里可以方便使用了。
Controller
方法参数使用
@GetMapping("getUserByUsername")
public String getUserByUsername(AuthUser user) {
...
user.getAge();
...
}
总结
上述介绍 HandlerMethodArgumentResolver
使用,原理请参考相关文章。
示例代码地址:UserArgumentResolver作者GitHub:
Purgeyao 欢迎关注qq交流群:
812321371
微信交流群:MercyYao
微信公众号:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。