Featured image of post SpringBoot2でレスポンスヘッダーに項目を追加する方法【X-Request-ID】

SpringBoot2でレスポンスヘッダーに項目を追加する方法【X-Request-ID】

SpringBoot2でレスポンスヘッダーに独自の項目を追加する方法。OncePerRequestFilterを継承したFilterでMDCのX-Request-IDをヘッダーに載せ、ConfigurationでBean登録するだけ。ログ調査が楽になります♪

893文字

カスタムヘッダーも簡単に設定可能

SpringBootを使ってAPI開発をしている場合、簡単にレスポンスヘッダーへ独自項目を追加する事が可能です。

今回は以前の記事でログに含めるために発行したX-Request-IDを、全リクエスト時のレスポンスヘッダーに自動で追加する方法をご紹介致します。

関連記事 【SpringBoot2】UUIDを自動採番してX-Request-Idとしてlogbackのログに埋め込む方法【MDC】 2019/04/30 1541文字 約4分で読めます IT Java Mac Windows アプリケーション

例えば、アプリから呼ばれるAPIなどのシステムの場合は、お問い合わせ時やシステムエラーのフィードバック時にサーバーから返ってきたX-Request-IDを含ませる事で、容易にサーバーログを絞る事が出来るためよりスピーディーにログ調査が行えます。

手順

OncePerRequestFilterを継承したFilterクラスを実装

まずは、前回のフィルターで発行されたX-Request-IdをMDCから取得し、レスポンスヘッダーに追加するFilterクラスを実装しましょう。

[adsense-responsive]

ResponseHeaderAddXRequestIdFilter
package tech.blogenist.service.account.api.infrastructure.filter.x_request_id;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.MDC;
import org.springframework.web.filter.OncePerRequestFilter;

public class ResponseHeaderAddXRequestIdFilter
        extends OncePerRequestFilter
{

    @Override
    protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain )
            throws ServletException, IOException
    {
        String xRequestId = MDC.get( MdcXRequestIdFilter.KEY );
        response.setHeader( MdcXRequestIdFilter.KEY, xRequestId );
        filterChain.doFilter( request, response );
    }

}

ConfigurationクラスでBean定義

次に、前回作ったConfigurationクラスにて新たにBeanとして追加しましょう。

XRequestIdFilterConfig
package tech.blogenist.service.account.api.infrastructure.filter.x_request_id;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class XRequestIdFilterConfig
{

    @Bean
    public MdcXRequestIdFilter mdcXRequestIdFilter()
    {
        MdcXRequestIdFilter filter = new MdcXRequestIdFilter();
        return filter;
    }


    //追加
    @Bean
    public ResponseHeaderAddXRequestIdFilter responseHeaderAddXRequestIdFilter()
    {
        ResponseHeaderAddXRequestIdFilter filter = new ResponseHeaderAddXRequestIdFilter();
        return filter;
    }
}

準備はこれだけです!

確認

では、実際に確認してみましょう。

[adsense-responsive]

curl 'http://localhost:8080/v1/accounts/10001/'
#サーバーログ
[DEBUG] [23e55d17-7d0c-4a8c-82e6-256df17b670a] [2019-05-01 15:26:34.619] [o.h.engine.internal.TwoPhaseLoad] - Done materializing entity [tech.blogenist.service.account.entity.db.account.CurrentAccountInfomationsTableEntity#component[value]{value=10001}]


# レスポンスヘッダー
< HTTP/1.1 200
< x-request-id: 23e55d17-7d0c-4a8c-82e6-256df17b670a
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Wed, 01 May 2019 06:26:34 GM

サーバーログのX-Request-IDとレスポンスヘッダーのX-Request-IDの値が同じになっていますね♪

もちろん、独自エラーのスロー時やシステムエラー時にもレスポンスヘッダーに追加されているので調査が捗りそうです。

オススメの商品

Spring Boot 2 プログラミング入門

日清 カップヌードル 77g×20個

終わりに

以上のように、簡単なクラスを追加するだけでログ調査が何倍もやりやすくなります。

何も仕込んでないログを漁るのは地獄なので、是非X-Request-IDを仕込んでみてください♪