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 就会执行自动解析参数类

希望对你有所帮助