废话不多说,直接上代码
调用方式
final String body = new RequestWrapper(request).getBody();
核心代码
import jakarta.servlet.ReadListener;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequestWrapper;
import org.springframework.util.StreamUtils;
import java.io.*;
import java.nio.charset.Charset;
/**
* Spring boot3 解决 Required request body is missing (流只能读一次的问题)
* 直接调用
* @author lqdev.com
*/
public class RequestWrapper extends HttpServletRequestWrapper {
private ByteArrayOutputStream cachedBytes;
public RequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public ServletInputStream getInputStream() throws IOException {
if (cachedBytes == null) {
cacheInputStream();
}
return new CachedServletInputStream();
}
@Override
public BufferedReader getReader() throws IOException{
return new BufferedReader(new InputStreamReader(getInputStream()));
}
private void cacheInputStream() throws IOException {
cachedBytes = new ByteArrayOutputStream();
StreamUtils.copy(getRequest().getInputStream(), cachedBytes);
}
public byte[] getBodyAsBytes() {
return (cachedBytes != null) ? cachedBytes.toByteArray() : new byte[0];
}
public String getBody() {
return new String(this.getBodyAsBytes(),Charset.defaultCharset());
}
class CachedServletInputStream extends ServletInputStream {
private ByteArrayInputStream input;
public CachedServletInputStream() {
input = new ByteArrayInputStream(cachedBytes.toByteArray());
}
@Override
public boolean isFinished() {
return input.available() == 0;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener readListener) {
throw new UnsupportedOperationException();
}
@Override
public int read() throws IOException {
return input.read();
}
}
}
以上答案来至chatGPT