SpringBoot 自动解析参数:HandlerMethodArgumentResolver

HandlerMethodArgumentResolver 是SpringBoot 中的一个接口,也是Spring 面向切面的编程的一种提现,这个接口我们从名称上大概能了解其中的意思:操作方法参数解析  ,换句话的意思就是说解析接口的参数方法,那么什么时候解析,自然是在调用函数之前解析,那些方法需要解析,自然是需要指定方法解析

比如我们写一个实现类:

package com.abs.system.filter;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 com.abs.system.util.Params;

public class AbsHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
	
	
	
	private Logger logger=LoggerFactory.getLogger(AbsHandlerMethodArgumentResolver.class);

	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		logger.info("正在调用执行:{}",parameter.getMember().getName());
		return parameter.hasParameterAnnotation(ToParams.class);
	}

	@Override
	public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
		logger.info("对用户请求进行解析");
		HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
		String token = request.getHeader("Authorization");
		ServletContext en = request.getServletContext();
		Params params = new Params();
		params.put("token", token);
		return params;
	}

}

在这个实现类中要执行两个方法是,一个是 1. 判断那些方法需要解析 2.如何解析

那么我们可以给接口增加一些注释,比如创建注释:

package com.abs.system.filter;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ToParams {

}

现在我需要解析的是,方法中包含@ToParams 注释的都进行解析,下面这个接口中正好包含这个注释,那么也就是我们在调用istokevalid 这个接口的之前,会执行自动解析函数的方法,或者说会执行上面我们自定义的实现类,对接口参数进行解析和封装

	@ResponseBody
	@RequestMapping("/istokenvalid")
	public JSONObject isTokenValid(@ToParams Params params){
		String token=params.getString("token");
		logger.info("当前用户token:{}",token);
		String userguid=AbsSessionHelper.getCurrentUserGuid(token);
		if(StrUtil.isNotBlank(userguid)) {
			return BuildJsonOfObject.getJsonString(MSG.ok, MSG.SUCCESSCODE);
		}
		return BuildJsonOfObject.getJsonString(MSG.TokenIsValid, MSG.FAILCODE);
		
	}

我们自定义的实现类一定会执行吗,肯定不是的,我们需要将其注册到拦截器中:

package com.abs.system.filter;

import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class AbsWebMvcConfigurerAdapter extends WebMvcConfigurationSupport {

     .........


	@Override
	public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) 
    {
             super.addArgumentResolvers(argumentResolvers);
	         argumentResolvers.add(new AbsHandlerMethodArgumentResolver());
    }


   .........
}

这样当我们调用接口的时候,如果包含@ToParams 就会执行自动解析参数类

希望对你有所帮助

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值