欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot項目實用功能之實現自定義參數解析器

 更新時間:2021年08月18日 10:03:53   作者:DDF_YiChen  
這篇文章主要介紹了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。

好了,以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java對象初始化順序的使用

    Java對象初始化順序的使用

    本篇文章介紹了,Java對象初始化順序的使用。需要的朋友參考下
    2013-04-04
  • Java Tree結構數據中查找匹配節(jié)點方式

    Java Tree結構數據中查找匹配節(jié)點方式

    這篇文章主要介紹了Java Tree結構數據中查找匹配節(jié)點方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • IntelliJ IDEA Tomcat控制臺中文亂碼問題的四種解決方案

    IntelliJ IDEA Tomcat控制臺中文亂碼問題的四種解決方案

    這篇文章主要給大家分享了4種方法完美解決IntelliJ IDEA Tomcat控制臺中文亂碼問題,文中有詳細的圖文介紹,對我們的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-08-08
  • spring-boot 禁用swagger的方法

    spring-boot 禁用swagger的方法

    本篇文章主要介紹了spring-boot 禁用swagger的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • java 中Spark中將對象序列化存儲到hdfs

    java 中Spark中將對象序列化存儲到hdfs

    這篇文章主要介紹了java 中Spark中將對象序列化存儲到hdfs的相關資料,需要的朋友可以參考下
    2017-06-06
  • SpringCloud之動態(tài)刷新、重試、服務化的實現

    SpringCloud之動態(tài)刷新、重試、服務化的實現

    這篇文章主要介紹了SpringCloud 之動態(tài)刷新、重試、服務化的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • struts2自定義MVC框架

    struts2自定義MVC框架

    這篇文章主要為大家詳細介紹了struts2如何自定義MVC框架,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • JAVA實現sm3加密簽名以及防止重復攻擊

    JAVA實現sm3加密簽名以及防止重復攻擊

    這篇文章主要給大家介紹了關于JAVA實現sm3加密簽名以及防止重復攻擊的相關資料,SM3是簽名算法,和MD5一樣(對于應用層來說),SM4是對稱加密算法,和AES一樣(對于應用層來說),需要的朋友可以參考下
    2023-10-10
  • Java的并發(fā)編程之CyclicBarrier解析

    Java的并發(fā)編程之CyclicBarrier解析

    這篇文章主要介紹了Java的并發(fā)編程之CyclicBarrier解析,CyclicBarrier支持一個可選的Runnable命令,在一組線程中的最后一個線程到達之后(但在釋放所有線程之前),該命令只在每個屏障點運行一次,需要的朋友可以參考下
    2023-11-11
  • Java數據類型轉換詳解

    Java數據類型轉換詳解

    這篇文章主要講解Java中基本數據類型、字符串與其它數據類型以及常見的日期類型的轉換,希望能給大家做一個參考。
    2016-06-06

最新評論