1
コンソールに500レスポンスボディをログに記録する:春ブーツ - どのように私は次のようにOncePerRequestFilter使用してリクエストごとにトリガーされる(春のブートV1.5を使用して)春のためのフィルタ作成した
@Component
class LogRequestFilter extends OncePerRequestFilter {
private static final Logger logger = LoggerFactory.getLogger(LogRequestFilter.class);
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(request);
ContentCachingResponseWrapper wrappedResponse = new ContentCachingResponseWrapper(response);
int responseStatus = wrappedResponse.getStatusCode();
if (responseStatus == 500) {
String requestUri = wrappedRequest.getRequestURI();
byte[] responseBodyBytes = wrappedResponse.getContentAsByteArray();
logger.error("{}, {}, {}", responseStatus, requestUri, new String(responseBodyBytes));
}
filterChain.doFilter(wrappedRequest, response);
}
}
私の問題をエラーが発生したときに応答本体を記録する必要があります。私は、要求がURIが正しいですが、レスポンスボディが不足していることが確認できるデバッグ中
{
"timestamp": 1512745726835,
"status": 500,
"error": "Internal Server Error",
"exception": "java.lang.NullPointerException",
"message": "No message available",
"path": "/documents/2017-02-17"
}
:しかし、私は、ユーザーが春からの次の応答を受けていても)(getContentAsByteArrayからのデータを取得していません。この問題を解決するにはどうすればよいですか?
チェックアウト[この回答](https://stackoverflow.com/questions/38614799/how-to-get-the-xml-from-post-request-and-modify-it-in-servlet-filter/ 38616378#38616378) –
彼はContentCachingResponseWrapperを使用していますが、これはまさにこのケースのために設計されています。ドキュメントなしで使用するのはちょっと難しいことです。 –
@Gorazd私はあなたに投票しただけで、次の人のコードを表示できると思います。 –