Выше создается новый запрос
Это не правда. Если, конечно, вы не отправляете перенаправление внутри сервлета, но это будет слишком очевидной ошибкой.
Мне нужно тело запроса, вызвавшего исключение.
Тело запроса может быть прочитано только один раз. Клиент не собирается отправлять его снова, когда вы захотите прочитать его еще раз. В случае обычных запросов application/x-www-form-urlencoded
POST сервер будет считывать и анализировать тело запроса в параметры запроса, как вы получаете по HttpServletRequest#getParameterMap()
. Если вы не хотите отображать все параметры запроса в хорошем списке / таблице по какой-то неочевидной причине, то вы также можете просто восстановить тело запроса на основе карты параметров запроса. Э.Г.
String requestBody = toQueryString(request.getParameterMap());
// ...
с
public static String toQueryString(Map<String, String[]> params) {
StringBuilder queryString = new StringBuilder();
for (Entry<String, String[]> param : params.entrySet()) {
for (String value : param.getValue()) {
if (queryString.length() > 0) {
queryString.append("&");
}
queryString
.append(URLEncoder.encode(param.getKey(), "UTF-8"))
.append("=")
.append(URLEncoder.encode(value, "UTF-8"));
}
}
return queryString.toString();
}
В случае multipart/form-data
запросов, это зависит от того, как вы анализируете тело запроса и храните данные. Реконструкция также менее тривиальна.
Если вы хотите полностью прозрачное решение, рассмотрите HttpServletRequestWrapper
, который копирует тело запроса в локальный (байтовый) буфер (или временный файл, когда он превышает определенный порог) всякий раз, когда вызывается getInputStream()
или getReader()
. Затем просто приведите HttpServletRequest
к вашей реализации оболочки и возьмите эту копию.