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

Springboot修改post請求接口入?yún)⒒蛑匦沦x值方式

 更新時(shí)間:2025年05月12日 09:17:11   作者:小目標(biāo)青年  
這篇文章主要介紹了Springboot修改post請求接口入?yún)⒒蛑匦沦x值方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

前言

很久之前寫過一篇就是自動填充接口參數(shù)的,利用的 HandlerMethodArgumentResolver 自定義注解

Springboot Controller接口默認(rèn)自動填充 業(yè)務(wù)實(shí)體參數(shù)值

現(xiàn)在這一篇也差不多,達(dá)到的目的就是重新去給post請求的參數(shù)賦值、修改啥的。

不多說,開始。

首先知道一點(diǎn),post請求的參數(shù),一旦取出來就沒了,因?yàn)槭橇鲾?shù)據(jù)。

所以老樣子,我們寫多一個(gè)HttpServletRequestWrapper :

BodyReaderHttpServletRequestWrapper

import org.apache.commons.lang3.StringUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
import java.util.Map;
import java.util.Vector;

/**
 * @Author : JCccc
 * @CreateTime : 2020/3/27
 * @Description :
 **/
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private final byte[] body;

    /**
     * 所有參數(shù)的集合
     */
    private Map<String, String[]> parameterMap;


    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        BufferedReader reader = request.getReader();
        body = readBytes(reader);
        parameterMap = request.getParameterMap();
    }


    @Override
    public BufferedReader getReader() throws IOException {

        ServletInputStream inputStream = getInputStream();

        if (null == inputStream) {
            return null;
        }

        return new BufferedReader(new InputStreamReader(inputStream));
    }

    @Override
    public Enumeration<String> getParameterNames() {
        Vector<String> vector = new Vector<>(parameterMap.keySet());
        return vector.elements();
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {

        if (body == null) {
            return null;
        }

        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
        return new ServletInputStream() {

            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener listener) {

            }

            @Override
            public int read() throws IOException {
                return bais.read();
            }
        };
    }

    /**
     * 通過BufferedReader和字符編碼集轉(zhuǎn)換成byte數(shù)組
     *
     * @param br
     * @return
     * @throws IOException
     */
    private byte[] readBytes(BufferedReader br) throws IOException {
        String str;
        StringBuilder retStr = new StringBuilder();
        while ((str = br.readLine()) != null) {
            retStr.append(str);
        }
        if (StringUtils.isNotBlank(retStr.toString())) {
            return retStr.toString().getBytes(StandardCharsets.UTF_8);
        }
        return null;
    }
}

然后是我們這一期的核心,

DefaultDataFillHandlerMethodArgumentResolver

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.speediance.admin.auth.ShiroUtils;
import com.speediance.admin.dto.req.UserDefaultDataFill;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.util.Date;
import java.util.Objects;

@Component
public class DefaultDataFillHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(UserDefaultDataFill.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        HttpServletRequest request = webRequest.getNativeRequest( HttpServletRequest.class );
        BodyReaderHttpServletRequestWrapper myRequestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
        // 從Request的包裝類中讀取數(shù)據(jù)
        BufferedReader reader = myRequestWrapper.getReader();
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        reader.close();
        JSONObject jsonObject = JSON.parseObject(sb.toString());
        Object bean = BeanUtils.instantiateClass(parameter.getParameterType());
        BeanWrapper beanWrapper = new BeanWrapperImpl(bean);
        //重新賦值
        for (String key : jsonObject.keySet()) {
            beanWrapper.setPropertyValue(key,jsonObject.get(key));
        }
        Long userId = //比如從數(shù)據(jù)庫查出來 或者從token解析出來;
   
 
        //舉例子給如入?yún)⒆詣犹畛?更新操作人
        beanWrapper.setPropertyValue("updateUserId", userId);
      
        return bean;
    }


}

然后就是重寫一個(gè)自定義注解 ,相當(dāng)于需要填充數(shù)據(jù)或者進(jìn)入到參數(shù)修改,我們采用它標(biāo)注:

UserDefaultDataFill

import java.lang.annotation.*;


@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserDefaultDataFill {

}

然后就OK了,看看怎么用:

比如說一個(gè)更新接口,我們想默認(rèn)填充上入?yún)⒗锩娴?修改用戶ID (簡單舉例,其余業(yè)務(wù)要修改值,賦值自己套用就可以)

然后可以看到我們的參數(shù)解析器里面的代碼 (其實(shí)就是復(fù)制流拿出參數(shù),修改完變成當(dāng)前接口的bean):

OK,就到這。

總結(jié)

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

相關(guān)文章

  • Java設(shè)計(jì)模式中觀察者模式詳解

    Java設(shè)計(jì)模式中觀察者模式詳解

    觀察者模式是極其重要的一個(gè)設(shè)計(jì)模式,也是我?guī)啄觊_發(fā)過程中使用最多的設(shè)計(jì)模式,本文首先概述觀察者模式的基本概念和Demo實(shí)現(xiàn),接著是觀察者模式在Java和Spring中的應(yīng)用,最后是對觀察者模式的應(yīng)用場景和優(yōu)缺點(diǎn)進(jìn)行總結(jié)
    2022-11-11
  • 解決Request.getParameter獲取不到特殊字符bug問題

    解決Request.getParameter獲取不到特殊字符bug問題

    這篇文章主要介紹了解決Request.getParameter獲取不到特殊字符bug問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • JavaFx 中創(chuàng)建計(jì)時(shí)器的步驟詳解

    JavaFx 中創(chuàng)建計(jì)時(shí)器的步驟詳解

    本文介紹了如何在JavaFx中創(chuàng)建計(jì)時(shí)器,通過創(chuàng)建計(jì)時(shí)器界面、編寫計(jì)時(shí)器邏輯以及關(guān)聯(lián)計(jì)時(shí)器按鈕,我們可以快速實(shí)現(xiàn)一個(gè)靈活可靠的計(jì)時(shí)器組件,本文能夠幫助讀者在 JavaFx 中成功實(shí)現(xiàn)自己的計(jì)時(shí)器功能,感興趣的朋友一起看看吧
    2023-11-11
  • Spring Data JPA實(shí)現(xiàn)動態(tài)條件與范圍查詢實(shí)例代碼

    Spring Data JPA實(shí)現(xiàn)動態(tài)條件與范圍查詢實(shí)例代碼

    本篇文章主要介紹了Spring Data JPA實(shí)現(xiàn)動態(tài)條件與范圍查詢實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-06-06
  • Java使用責(zé)任鏈模式處理學(xué)生請假問題詳解

    Java使用責(zé)任鏈模式處理學(xué)生請假問題詳解

    這篇文章主要介紹了Java使用責(zé)任鏈模式處理學(xué)生請假問題,結(jié)合實(shí)例形式詳細(xì)分析了責(zé)任鏈模式的概念、原理及Java使用責(zé)任鏈模式處理學(xué)生請假問題的相關(guān)步驟、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2018-04-04
  • MybatisPlus批量保存原理及失效原因排查全過程

    MybatisPlus批量保存原理及失效原因排查全過程

    這篇文章主要介紹了MybatisPlus批量保存原理及失效原因排查全過程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Java如何替換第一個(gè)和最后一個(gè)字符串

    Java如何替換第一個(gè)和最后一個(gè)字符串

    這篇文章主要介紹了Java如何替換第一個(gè)和最后一個(gè)字符串的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解Java ArrayList類

    詳解Java ArrayList類

    這篇文章主要介紹了Java ArrayList類的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • maven項(xiàng)目連接MySQL方式(使用原生的jdbc)

    maven項(xiàng)目連接MySQL方式(使用原生的jdbc)

    文章介紹了如何在項(xiàng)目中添加依賴、組織目錄結(jié)構(gòu)、配置數(shù)據(jù)庫連接屬性以及編寫工具類,并分享了個(gè)人經(jīng)驗(yàn),鼓勵讀者參考和支持腳本之家
    2026-03-03
  • Java時(shí)區(qū)轉(zhuǎn)換實(shí)例代碼解析

    Java時(shí)區(qū)轉(zhuǎn)換實(shí)例代碼解析

    這篇文章主要介紹了Java時(shí)區(qū)轉(zhuǎn)換實(shí)例代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評論

大荔县| 克东县| 蓬安县| 江西省| 罗甸县| 博乐市| 兴业县| 郧西县| 琼结县| 泸州市| 湘乡市| 万荣县| 宾阳县| 清徐县| 岳池县| 赤城县| 比如县| 前郭尔| 东安县| 南和县| 岑溪市| 建瓯市| 漳州市| 翁牛特旗| 营口市| 东城区| 清镇市| 巨鹿县| 大埔区| 文昌市| 靖边县| 孟连| 张北县| 崇仁县| 永济市| 健康| 西乡县| 沙田区| 罗江县| 南乐县| 虞城县|