@requestbody复用问题

各位好,
今天遇到了个问题
后端我用@requestbody JsonObject json 进行接收application/json的参数,因为需求我需要进行aop,使用了@around
静态获取request后 发现流已经被springmvc读过
导致用流获取参数的时候 stream closed,
但是又需要前端传过来的参数,如何获取呢 或者如何复用@requestbody 里面的参数呢
蟹蟹!!!!!!!!

阅读 4.7k
4 个回答

image.png
在切面类中绑定参数ProceedingJoinPoint,然后用这个对象getArgs()方法获取接口方法的参数。

需要的数据都已经放到参数里了
为什么还需要重新读流?

改下切面的方法拿请求的参数不就好了。或者参考下这篇文章重新包装request

对流做一层包装可以继续读,这个问题我以前遇到过,参考代码:

public class RequestWrapper extends HttpServletRequestWrapper {
    /**
     * 请求body
     * */
    private final String body;

    public RequestWrapper(HttpServletRequest request) {
        super(request);
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        InputStream inputStream = null;
        try {
            inputStream = request.getInputStream();
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
                stringBuilder.append("");
            }
        } catch (IOException ex) {
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        body = stringBuilder.toString();
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
        ServletInputStream servletInputStream = new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return false;
            }

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

            @Override
            public void setReadListener(ReadListener readListener) {
            }

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

        return servletInputStream;

    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }

    public String getBody() {
        return this.body;
    }
}
 
推荐问题