最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot項(xiàng)目實(shí)用功能之實(shí)現(xiàn)自定義參數(shù)解析器

 更新時(shí)間:2021年08月18日 10:03:53   作者:DDF_YiChen  
這篇文章主要介紹了SpringBoot項(xiàng)目實(shí)用功能之實(shí)現(xiàn)自定義參數(shù)解析器,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

核心點(diǎn)

1、實(shí)現(xiàn)接口

org.springframework.web.method.support.HandlerMethodArgumentResolver
  • supportsParameter 方法根據(jù)當(dāng)前方法參數(shù)決定是否需要應(yīng)用當(dāng)前這個(gè)參數(shù)解析器
  • resolveArgument 執(zhí)行具體的解析過程

2、將自實(shí)現(xiàn)的參數(shù)解析器類

添加到Spring容器中

3、實(shí)現(xiàn)

org.springframework.web.servlet.config.annotation.WebMvcConfigurer

接口addArgumentResolvers方法,將自己的參數(shù)解析器加入到列表中

動(dòng)手實(shí)現(xiàn)

有點(diǎn)懶,也不想直接找一個(gè)例子了,之前正好寫過一個(gè),允許前端定義查詢表達(dá)式,可以讓前端自定義查詢字段查詢條件和查詢值,然后進(jìn)行and和or的組合,那么就每個(gè)條件就是一個(gè)查詢對(duì)象,多個(gè)的話就組成一個(gè)查詢對(duì)象列表對(duì)象,這里只展示思路,就補(bǔ)貼實(shí)際的類的代碼了。

簡(jiǎn)單說(shuō)明一下, 這個(gè)參數(shù)解析器是用來(lái)解析List<QueryParam>這個(gè)形式的參數(shù)類型的。

1、實(shí)現(xiàn)

org.springframework.web.method.support.HandlerMethodArgumentResolver
public class QueryParamArgumentResolver implements HandlerMethodArgumentResolver {
    /**
     * 判斷當(dāng)前參數(shù)是否需要解析,該解析器用來(lái)解析參數(shù)類型為L(zhǎng)ist<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;
    }
    /**
     * 將前端參數(shù)名稱為{@link ContextKey#queryParams}的字符串值解析為L(zhǎng)ist<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、在配置類中注冊(cè)當(dāng)前自定義的參數(shù)解析器

這里采用直接實(shí)現(xiàn)org.springframework.web.servlet.config.annotation.WebMvcConfigurer接口,通過增加@Configuration注解,即充當(dāng)了配置類,又可以實(shí)現(xiàn)添加webmvc功能的接口

@Configuration
public class CoreWebConfig implements WebMvcConfigurer {
    /**
     * 注冊(cè)解析器
     *
     * @return
     */
    @Bean
    public QueryParamArgumentResolver queryParamArgumentResolver() {
        return new QueryParamArgumentResolver();
    }
    
    /**
     * 配置自定義參數(shù)解析器
     *
     * @param resolvers
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(queryParamArgumentResolver());
    }
}

項(xiàng)目實(shí)例

在某些對(duì)外的接口中,可能會(huì)存在這樣一種情況

相同的一個(gè)接口,即需要滿足對(duì)方用Content-Type: application/json這種格式傳輸,那么對(duì)應(yīng)的后臺(tái)接口就需要用@RequestBody來(lái)注解參數(shù);還有一些老的用戶用application/x-www-form-urlencoded這種傳參的話,那么后臺(tái)參數(shù)一定不能使用@RequestBody來(lái)注釋參數(shù),因?yàn)檫@兩種請(qǐng)求方式對(duì)應(yīng)的后臺(tái)的參數(shù)解析器是不一樣的。

那么如果我們想要相同的寫法,兩種參數(shù)都支持的話,就需要自定義參數(shù)解析器了。

當(dāng)然需要明確一點(diǎn),這個(gè)自定義的參數(shù)解析器和其它可能會(huì)有點(diǎn)不一樣,因?yàn)槠鋵?shí)對(duì)應(yīng)的兩種參數(shù)解析,SpringMVC都有了自己對(duì)應(yīng)的參數(shù)解析器,我們現(xiàn)在只是在前面攔截一層,根據(jù)根據(jù)Content-Type做一層轉(zhuǎn)發(fā),最后還是委托給對(duì)應(yīng)的參數(shù)解析器來(lái)完成這個(gè)工作。

關(guān)于這一塊,之前寫過一篇文章了,可以參考自定義參數(shù)解析器同一個(gè)參數(shù)支持多種Content-Type。

好了,以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot整合JPA過程解析

    springboot整合JPA過程解析

    這篇文章主要介紹了springboot整合JPA過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • java實(shí)現(xiàn)小i機(jī)器人api接口調(diào)用示例

    java實(shí)現(xiàn)小i機(jī)器人api接口調(diào)用示例

    這篇文章主要介紹了java實(shí)現(xiàn)小i機(jī)器人api接口調(diào)用示例,需要的朋友可以參考下
    2014-04-04
  • SpringBoot整合Mybatis-Plus+Druid實(shí)現(xiàn)多數(shù)據(jù)源配置功能

    SpringBoot整合Mybatis-Plus+Druid實(shí)現(xiàn)多數(shù)據(jù)源配置功能

    本文主要講解springboot?+mybatisplus?+?druid?實(shí)現(xiàn)多數(shù)據(jù)源配置功能以及一些必要的準(zhǔn)備及代碼說(shuō)明,具有一定的參考價(jià)值,感興趣的小伙伴可以借鑒一下
    2023-06-06
  • MyBatis-plus報(bào)錯(cuò)Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required的解決方法

    MyBatis-plus報(bào)錯(cuò)Property ‘sqlSessionFactory‘ or 

    這篇文章主要給大家介紹了MyBatis-plus 報(bào)錯(cuò) Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required的兩種解決方法,如果遇到相同問題的朋友可以參考借鑒一下
    2023-12-12
  • Java 在 Word 文檔中使用新文本替換指定文本的方法

    Java 在 Word 文檔中使用新文本替換指定文本的方法

    這篇文章主要介紹了Java 在 Word 文檔中使用新文本替換指定文本的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 鎖超時(shí)發(fā)現(xiàn)parallelStream并行流線程上下文坑解決

    鎖超時(shí)發(fā)現(xiàn)parallelStream并行流線程上下文坑解決

    這篇文章主要為大家介紹了鎖超時(shí)發(fā)現(xiàn)parallelStream并行流線程上下文坑解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java調(diào)用Shell命令的方法

    Java調(diào)用Shell命令的方法

    這篇文章主要介紹了Java調(diào)用Shell命令的方法,實(shí)例分析了java調(diào)用shell命令的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • SpringBoot中如何統(tǒng)一接口返回與全局異常處理詳解

    SpringBoot中如何統(tǒng)一接口返回與全局異常處理詳解

    全局異常處理是個(gè)比較重要的功能,一般在項(xiàng)目里都會(huì)用到,這篇文章主要給大家介紹了關(guān)于SpringBoot中如何統(tǒng)一接口返回與全局異常處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • 一文帶你熟練掌握J(rèn)ava中的日期時(shí)間相關(guān)類

    一文帶你熟練掌握J(rèn)ava中的日期時(shí)間相關(guān)類

    我們?cè)陂_發(fā)時(shí),除了數(shù)字、數(shù)學(xué)這樣的常用API之外,還有日期時(shí)間類,更是會(huì)被經(jīng)常使用,比如我們項(xiàng)目中必備的日志功能,需要記錄異常等信息產(chǎn)生的時(shí)間,本文就帶各位來(lái)學(xué)習(xí)一下相關(guān)的日期時(shí)間類有哪些
    2023-05-05
  • java中File類的三種創(chuàng)建文件夾方法總結(jié)

    java中File類的三種創(chuàng)建文件夾方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于java中File類的三種創(chuàng)建文件夾方法,File類代表文件或目錄路徑名的抽象表達(dá)形式,通過File類提供的方法,我們可以很方便地創(chuàng)建文件夾,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04

最新評(píng)論

深水埗区| 秦安县| 江川县| 上高县| 商丘市| 定边县| 凉城县| 太仓市| 沙河市| 石林| 双柏县| 寻乌县| 宝丰县| 塔城市| 遂溪县| 锡林浩特市| 成安县| 吐鲁番市| 宁波市| 孝义市| 潼南县| 昆山市| 贡觉县| 新乡市| 东源县| 股票| 涞源县| 上蔡县| 宁国市| 息烽县| 榆中县| 德阳市| 肃北| 蛟河市| 阜新市| 分宜县| 通辽市| 江阴市| 克什克腾旗| 临夏市| 舟曲县|