Я хочу получить тело запроса из запроса с помощью getInputStream (). Я сделал Requestwrapper, чтобы я мог кэшировать запрос, но он, похоже, не работает, так как поток закрыт, исключение возникает в любом случае, когда я вызываю getInputStream () или getReader (). Что я делаю не так?
Вот мой код звонящего:
RequestWrapper request = new RequestWrapper(((ServletRequestAttributes) RequestContextHolder
.currentRequestAttributes())
.getRequest());
InputStream obj = request.getInputStream(); //**java.io.IOException: Stream closed**
Вот класс Request Wrapper, который должен кэшировать запрос:
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
public class RequestWrapper extends HttpServletRequestWrapper {
private ByteArrayOutputStream cachedBytes;
public RequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public ServletInputStream getInputStream() throws IOException {
if (cachedBytes == null) {
cacheInputStream();
}
System.out.println("cachednotnull");
return new CachedServletInputStream();
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
private void cacheInputStream() throws IOException {
/* Cache the inputstream in order to read it multiple times. For
* convenience, I use apache.commons IOUtils
*/
cachedBytes = new ByteArrayOutputStream();
IOUtils.copy(super.getInputStream(), cachedBytes);
}
/* An inputstream which reads the cached request body */
public class CachedServletInputStream extends ServletInputStream {
private ByteArrayInputStream input;
public CachedServletInputStream() {
/* create a new input stream from the cached request body */
input = new ByteArrayInputStream(cachedBytes.toByteArray());
}
@Override
public boolean isFinished() {
return input.available() == 0;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener listener) {
throw new RuntimeException("Not implemented");
}
@Override
public int read() throws IOException {
// TODO Auto-generated method stub
return input.read();
}
}
}