springMVC自定义解析器HandlerMethodArgumentResolver

在日常开发中 ,经常出现这样的场景:根据请求获取当前用户的信息进行操作 类似于;

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 使用方便 

猜你喜欢

转载自blog.csdn.net/qq_34661615/article/details/101542226