各位好,
今天遇到了个问题
后端我用@requestbody JsonObject json 进行接收application/json的参数,因为需求我需要进行aop,使用了@around
静态获取request后 发现流已经被springmvc读过
导致用流获取参数的时候 stream closed,
但是又需要前端传过来的参数,如何获取呢 或者如何复用@requestbody 里面的参数呢
蟹蟹!!!!!!!!
各位好,
今天遇到了个问题
后端我用@requestbody JsonObject json 进行接收application/json的参数,因为需求我需要进行aop,使用了@around
静态获取request后 发现流已经被springmvc读过
导致用流获取参数的时候 stream closed,
但是又需要前端传过来的参数,如何获取呢 或者如何复用@requestbody 里面的参数呢
蟹蟹!!!!!!!!
对流做一层包装可以继续读,这个问题我以前遇到过,参考代码:
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;
}
}
4 回答1.7k 阅读✓ 已解决
4 回答1.5k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
4 回答2.3k 阅读
3 回答1.2k 阅读✓ 已解决
2 回答832 阅读✓ 已解决
2 回答1.4k 阅读
在切面类中绑定参数ProceedingJoinPoint,然后用这个对象getArgs()方法获取接口方法的参数。