Spring Boot(v1.5.9.RELEASE)
-
效果:
请求 "/test?objClientModel={ReplaceValue:'d',ReplaceValueLike:'rep',ProjectGroup:'3'}"时, "/test" 所在的控制器获取到两对象 : 一个是客户端传入的ClientModel实例 一个是自定义的对象CustomModel实例( 可以作为session信息传入, 在调用test方法前先通过sessionid或者其他信息从redis获取登录信息, 并写入到一个CustomModel实例然后传入test, 这样就能使用登录信息 )
-
api目标方法:
@RestController
public class testController {
@RequestMapping(value = "/test")
public String test(ClientModel objClientModel, CustomModel objCustomModel){
return "success";
}
}
-
实现 HandlerMethodArgumentResolver 接口:
supportsParameter 筛选需要进行自定义的类的逻辑, 这里需要设置先不做过滤, 把过滤规则写到resolveArgument里, 否则可能要写多个实现 HandlerMethodArgumentResolver 接口的实现类, 每一个都在supportsParameter配置规则: resolveArgument 在调用test方法前, 会先遍历方法的参数, 每次都会调用resolveArgument, 这里只处理CustomModel类, 其他类的参数直接反序列化为对应对象传入.
package configcenter.aop;
public class ParamHandler implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return true;
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
if (methodParameter.getParameterType() == CustomModel.class){
CustomModel objCustomModel = new CustomModel();
objCustomModel.ConfigName = "文件保存路径";
objCustomModel.ConfigValue = "/var/project/static/files/";
objCustomModel.SystemName = "filePath";
return objCustomModel;
}
//获取本次请求
HttpServletRequest objHttpServletRequest = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
//通过参数名获取请求的参数
String clientParam = objHttpServletRequest.getParameter(methodParameter.getParameterName());
Object obj = new Gson().fromJson(clientParam, methodParameter.getParameterType());
return obj;
}
}
- 在项目配置类注册上面的参数解析器
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Override
protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
//argumentResolvers.add(new RquestParamResolver());
argumentResolvers.add(new ParamHandler());
}
}
- 重启项目, 正常运行.