HandlerMethodArgumentResolver 引數解析器
HandlerMethodArgumentResolver介面包含兩個介面方法
boolean supportsParameter(MethodParameter parameter);
MethodParameter方法引數物件 通過它可以獲取該方法引數上的一些資訊 如方法引數中的註解資訊等
通過該方法我們如果需要對某個引數進行處理 只要此處返回true即可 如對Date型別資料處理的話
Class parameterType=parameter.getParameterType();
return parameterType.equals(Date.class);
另一個為
Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;
該方法就是對引數的解析,返回的Object會自動賦值到引數物件中
例項: 自定義一個日期處理註解,通過一個HandlerMethodArgumentResolver來解析
第一步:為HandlerAdapter配置一個自定義的HandlerMethodArgumentResolver
1 2 3 4 5 |
< mvc:argument-resolvers >
|
第二步:定義一個日期註解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface CustomerDate {
String value();
}
|
|
第三步: 實現HandlerMethodArgumentResolver
public class CustomerHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
Annotation[] methodAnnotations= parameter.getParameterAnnotations();
for(Annotation annotation:methodAnnotations){
if(annotation instanceof CustomerDate){
CustomerDate customerDate=(CustomerDate)annotation;
String dataStringValue=customerDate.value();
SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd HH:mm");
return formater.parse(dataStringValue);
}
}
return null;
}
@SuppressWarnings("unchecked")
public boolean supportsParameter(MethodParameter parameter) {
Class parameterType=parameter.getParameterType();
return parameterType.equals(Date.class);
}
}
第四步: 控制器處理
@RequestMapping("/user_list")
@ResponseBody
public Map <String,Object> userList(@CustomerDate(value = "2015-02-01 03:55") Date date,HttpServletRequest request,@PageableDefault(page=0,size=10) Pageable pageable,Model modelMap) {
Map<String,String[]> params=HttpUtils.getParameterValuesMap(request,Constants.SEARCH_PREFIX);
Page<User> userPage=userService.findPage(pageable,params);
Map<String,Object> results=new HashMap<String,Object> ();
results.put("total", userPage.getTotalElements());
results.put("rows", userPage.getContent());
return results;
}
通過上面的處理: 通過CustomerDate 註解 我們可以通過value來制定具體的日期,並且會自動為date賦值,通過此小例子我們可以引申出各種實現