前端请求示例
http://localhost:8081/learn?page=14&size=31&s_startDate=2021-06-11
后端Controller类中的handler method示例
@GetMapping(value = "learn")
public Result learn(Pageable pageable, SearchData searchData) {
System.out.println(pageable);
System.out.println(searchData);
return new Result("success", "获取分页参数成功!", null);
}
自定义SearchData示例
public class SearchData {
private final Map<String,Object> params = new HashMap<>();
public SearchData() {}
public Object getValue(String key) {
return params.get(key);
}
public void put(final String key, final Object value) {
this.params.put(key,value);
}
@Override
public String toString() {
return "SearchData{" +
"params=" + params +
'}';
}
}
实现HandlerMethodArgumentResolver示例
public class SearchDataArgumentResolver implements HandlerMethodArgumentResolver {
/**
*
* @param methodParameter handler method中的形参
* @return 是否是自己想要处理的形参
*/
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
// 形参类型是否与自己想要对特殊参数进行封装的类型一致
return SearchData.class.equals(methodParameter.getParameterType());
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
SearchData searchData = new SearchData();
// 获取所有参数名列表,过滤出自己想要的参数,并放到SearchData中
nativeWebRequest.getParameterNames().forEachRemaining((paramName) -> {
if (paramName.startsWith("s_")) {
// 由于根据参数名获取到的参数都为数组,简单的对单个参数进行处理
String[] parameterValues = nativeWebRequest.getParameterValues(paramName);
if (parameterValues != null && parameterValues.length == 1) {
searchData.put(paramName.substring(2),parameterValues[0]);
}else {
searchData.put(paramName.substring(2),parameterValues);
}
}
});
return searchData;
}
}
将自定义的HandlerMethodArgumentResolver添加到argumentResolvers列表中
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new PageableHandlerMethodArgumentResolver());
// 将自定义的SearchDataArgumentResolver放入到argumentResolvers中
argumentResolvers.add(new SearchDataArgumentResolver());
super.addArgumentResolvers(argumentResolvers);
}
}
测试结果:
// 成功将page、size、s_startDate放入到两个参数接收对象中
Page request [number: 14, size 31, sort: UNSORTED]
SearchData{params={startDate=2021-06-11}}