SpringBoot項目實用功能之實現自定義參數解析器
核心點
1、實現接口
org.springframework.web.method.support.HandlerMethodArgumentResolver
- supportsParameter 方法根據當前方法參數決定是否需要應用當前這個參數解析器
- resolveArgument 執(zhí)行具體的解析過程
2、將自實現的參數解析器類
添加到Spring容器中
3、實現
org.springframework.web.servlet.config.annotation.WebMvcConfigurer
接口addArgumentResolvers方法,將自己的參數解析器加入到列表中
動手實現
有點懶,也不想直接找一個例子了,之前正好寫過一個,允許前端定義查詢表達式,可以讓前端自定義查詢字段查詢條件和查詢值,然后進行and和or的組合,那么就每個條件就是一個查詢對象,多個的話就組成一個查詢對象列表對象,這里只展示思路,就補貼實際的類的代碼了。
簡單說明一下, 這個參數解析器是用來解析List<QueryParam>這個形式的參數類型的。
1、實現
org.springframework.web.method.support.HandlerMethodArgumentResolver
public class QueryParamArgumentResolver implements HandlerMethodArgumentResolver { /** * 判斷當前參數是否需要解析,該解析器用來解析參數類型為List<QueryParam> * * @param parameter * @return */ @Override public boolean supportsParameter(MethodParameter parameter) { boolean isList = List.class.equals(parameter.getParameterType()); if (isList) { Type genericType = parameter.getGenericParameterType(); if (genericType instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) genericType; Type actualTypeArgument = parameterizedType.getActualTypeArguments()[0]; return actualTypeArgument.getTypeName().equals(QueryParam.class.getName()); } } return false; } /** * 將前端參數名稱為{@link ContextKey#queryParams}的字符串值解析為List<QueryParam>,用于查詢 * * @param parameter * @param mavContainer * @param webRequest * @param binderFactory * @return * @throws Exception */ @Override public List<QueryParam> resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { String queryParamsStr = webRequest.getParameter(ContextKey.queryParams.name()); if (StrUtil.isBlank(queryParamsStr)) { return Collections.emptyList(); } final List<QueryParam> params = JsonUtil.getInstance() .readValue(queryParamsStr, new TypeReference<List<QueryParam>>() { @Override public Type getType() { return super.getType(); } }); if (CollectionUtil.isNotEmpty(params)) { for (QueryParam param : params) { if (param.getRelative() == null) { param.setRelative(QueryParam.Relative.AND); } if (param.getOp() == null) { param.setOp(QueryParam.Op.EQ); } } } return params; } }
2、在配置類中注冊當前自定義的參數解析器
這里采用直接實現org.springframework.web.servlet.config.annotation.WebMvcConfigurer接口,通過增加@Configuration注解,即充當了配置類,又可以實現添加webmvc功能的接口
@Configuration public class CoreWebConfig implements WebMvcConfigurer { /** * 注冊解析器 * * @return */ @Bean public QueryParamArgumentResolver queryParamArgumentResolver() { return new QueryParamArgumentResolver(); } /** * 配置自定義參數解析器 * * @param resolvers */ @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(queryParamArgumentResolver()); } }
項目實例
在某些對外的接口中,可能會存在這樣一種情況
相同的一個接口,即需要滿足對方用Content-Type: application/json這種格式傳輸,那么對應的后臺接口就需要用@RequestBody來注解參數;還有一些老的用戶用application/x-www-form-urlencoded這種傳參的話,那么后臺參數一定不能使用@RequestBody來注釋參數,因為這兩種請求方式對應的后臺的參數解析器是不一樣的。
那么如果我們想要相同的寫法,兩種參數都支持的話,就需要自定義參數解析器了。
當然需要明確一點,這個自定義的參數解析器和其它可能會有點不一樣,因為其實對應的兩種參數解析,SpringMVC都有了自己對應的參數解析器,我們現在只是在前面攔截一層,根據根據Content-Type做一層轉發(fā),最后還是委托給對應的參數解析器來完成這個工作。
關于這一塊,之前寫過一篇文章了,可以參考自定義參數解析器同一個參數支持多種Content-Type。
好了,以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
IntelliJ IDEA Tomcat控制臺中文亂碼問題的四種解決方案
這篇文章主要給大家分享了4種方法完美解決IntelliJ IDEA Tomcat控制臺中文亂碼問題,文中有詳細的圖文介紹,對我們的學習或工作有一定的幫助,需要的朋友可以參考下2023-08-08SpringCloud之動態(tài)刷新、重試、服務化的實現
這篇文章主要介紹了SpringCloud 之動態(tài)刷新、重試、服務化的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10