2017-12-08 8 views
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からのデータを取得していません。この問題を解決するにはどうすればよいですか?

+0

チェックアウト[この回答](https://stackoverflow.com/questions/38614799/how-to-get-the-xml-from-post-request-and-modify-it-in-servlet-filter/ 38616378#38616378) –

+1

彼はContentCachingResponseWrapperを使用していますが、これはまさにこのケースのために設計されています。ドキュメントなしで使用するのはちょっと難しいことです。 –

+0

@Gorazd私はあなたに投票しただけで、次の人のコードを表示できると思います。 –

答えて

1

メソッド呼び出しを移動してから、wrappedResponseの内容を読み取る前に、 最後にwrappedResponse.copyBodyToResponse()と呼んでください。

関連する問題