将前端参数分别映射到两个对象中

前端请求示例

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}}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值