通过调用argumentResolvers.supportsParameter这个方法来判断HandlerMethodArgumentResolver的实现类是否支持对应的参数的解析,和resolveArgument方法来实现真正的参数解析。
所以我们先看一下ServletRequestMethodArgumentResolver这个类中的supportsParameter这个方法的内容:
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(AutowiredParams.class);
}
从上面的代码中我们可以看到如果控制器中的参数使用@AutowiredParams进行注解的话,则使用这个参数解析器进行参数的解析,下面我们在看一下ServletRequestMethodArgumentResolver是怎么进行参数解析工作的:
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
Object resBean = null;
try {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
resBean = com.zhang.oa.utils.Params.getInstanceFromRequest(request);
} catch (Exception e) {
e.printStackTrace();
}
return resBean;
}从
代码非常简单,其中 com.zhang.oa.utils.Params是自己开发的一个类型,这段代码就是将HttpServletRequest中的参数转换成我们需要的类型,最后将转换后的对象返回就可以了。
除此之外,我们还需要开发一个接口,该接口就是hasParameterAnnotation指定的接口。
package com.zhang.oa.paramresolver;
import java.lang.annotation.*;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AutowiredParams {
}
这样就可以在控制器中通过使用@AutowiredParams的形式来使用。控制器代码如下。
@RequestMapping(value="/mobile/oa/jysqList",produces = {"application/json;charset=UTF-8"})
@ResponseBody
public String jysqList(@AutowiredParams Params params) {
return jyServer.jysqList(params);
}
其中Params是我们自定义的类型,你可以根据需求进行修改。