在日常开发中 ,经常出现这样的场景:根据请求获取当前用户的信息进行操作 类似于;
public class AccountController extends BasicController {
@RequestMapping(value = {"/XXXX"}, method = RequestMethod.POST)
public H5ResultVo<Void> XXXX(HttpServletRequest Request , @Valid @RequestBody XXVo reqVo) {
CrmUserInfo crmUserInfo = authComponent.getUserInfo(request);
XXXX;
}
总是这样子操作,每次用到的时候就在代码中写一遍CrmUserInfo crmUserInfo = authComponent.getUserInfo(request); 这样子代码很冗余,可以利用HandlerMethodArgumentResolver 接口 这种AOP的模式,来进行注入CrmUserInfo 。
1,HandlerMethodArgumentResolver 接口 是 处理函数参数的分解器 ,(也就是请求参数)它有两个方法supportsParameter (判断解析参数是否可以处理 可以处理返回 true 执行resolveArgument方法)和resolveArgument(解析参数并返回),接下来就是利用这个解析器接口进行操作。
2.1首先建立一个实体类注解
import java.lang.annotation.*;
//CrmUserInfo 实体类 自定义解析注解
@Documented
@Target({ ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface CrmUserInfoTail {
}
2.2 建立CrmUserInfoHandlerMethodArgumentResolver 类实现HandlerMethodArgumentResolver接口
@Configuration
public class CrmUserInfoHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private AuthComponent authComponent;
private Class<?> crmUserInfoClass = CrmUserInfo.class;
@Override
public boolean supportsParameter(MethodParameter parameter) {
//请求handler 有 这个@CrmUserInfoTail 则返回 true 执行下面的resolveArgument解析 方法
if (parameter.hasParameterAnnotation(CrmUserInfoTail.class)) {
return true;
}
return false;
}
// 解析参数
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
CrmUserInfo crmUserInfo = authComponent.getUserInfo(request);
if (null == crmUserInfo) {
return null;
}
Class<?> isCrmUserInfoClass = parameter.getParameterType();
if (isCrmUserInfoClass.isAssignableFrom(crmUserInfoClass)) {
return crmUserInfo;
}
return null;
}
}
2.3,config配置CrmUserInfoHandlerMethodArgumentResolver bean (本项目使用的springboot项目)
@Configuration
public class WebConfiguration extends WebMvcConfigurerAdapter {
@Resource
private CrmUserInfoHandlerMethodArgumentResolver crmUserInfoHandlerMethodArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
super.addArgumentResolvers(argumentResolvers);
// 可以配置多个自定义解析器
argumentResolvers.add(crmUserInfoHandlerMethodArgumentResolver);
}
2.4 在controller 使用
public class AccountController extends BasicController {
@RequestMapping(value = {"/XXXX"}, method = RequestMethod.POST)
public H5ResultVo<Void> XXXX(@CrmUserInfoTail CrmUserInfo crmUserInfo , @Valid @RequestBody XXVo reqVo) {
// 直接就可以使用了 不用写一大串啰嗦的代码了
crmUserInfo
XXXX;
}
2.5 使用方便