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 |
|
第二步:定义一个日期注解
@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赋值,通过此小例子我们可以引申出各种实现