Encontramos el arreglo a esta duda, al menos eso deseamos. Si presentas inquietudes dínoslo, que para nosotros será un gusto responderte
Solución:
Código de trabajo basado en la respuesta aceptada.
public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper
private static final Logger logger = Logger.getLogger(CustomHttpServletRequestWrapper.class);
private final String body;
public CustomHttpServletRequestWrapper(HttpServletRequest request)
super(request);
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try
InputStream 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)
logger.error("Error reading the request body...");
finally
if (bufferedReader != null)
try
bufferedReader.close();
catch (IOException ex)
logger.error("Error closing bufferedReader...");
body = stringBuilder.toString();
@Override
public ServletInputStream getInputStream () throws IOException
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
ServletInputStream inputStream = new ServletInputStream()
public int read () throws IOException
return byteArrayInputStream.read();
;
return inputStream;
Probablemente comience a consumir HttpServletRequest usando getReader()
en :
String ba = getBaId(getBody(httpRequest));
Su servlet intenta llamar getInputStream()
en la misma solicitud, lo cual no está permitido. Lo que tienes que hacer es usar un ServletRequestWrapper
para hacer una copia del cuerpo de la solicitud, para que pueda leerlo con múltiples métodos. No tengo tiempo para encontrar un ejemplo completo, ¿sabes?… lo siento…
Esto funcionó para mí. implementa getInputStream
.
private class MyHttpServletRequestWrapper extends HttpServletRequestWrapper
private byte[] body;
public MyHttpServletRequestWrapper(HttpServletRequest request)
super(request);
try
body = IOUtils.toByteArray(request.getInputStream());
catch (IOException ex)
body = new byte[0];
@Override
public ServletInputStream getInputStream() throws IOException
return new ServletInputStream()
ByteArrayInputStream bais = new ByteArrayInputStream(body);
@Override
public int read() throws IOException
return bais.read();
;
Entonces usas en tu método:
//copy body
servletRequest = new MyHttpServletRequestWrapper(servletRequest);
Si haces scroll puedes encontrar las ilustraciones de otros sys admins, tú igualmente tienes la opción de insertar el tuyo si lo crees conveniente.