WebConfiguration.java

package com.project.auth.config.web;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

import java.time.Clock;

@Configuration
@EnableConfigurationProperties(AccessLogProperties.class)
public class WebConfiguration {

    @Bean
    public FilterRegistrationBean<TraceIdFilter> traceIdFilter() {
        FilterRegistrationBean<TraceIdFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new TraceIdFilter());
        registration.addUrlPatterns("/*");
        registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registration;
    }

    @Bean
    public FilterRegistrationBean<RequestAccessLogFilter> requestAccessLogFilter(
            AccessLogProperties accessLogProperties
    ) {
        FilterRegistrationBean<RequestAccessLogFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new RequestAccessLogFilter(accessLogProperties));
        registration.addUrlPatterns("/*");
        registration.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
        return registration;
    }

    @Bean
    public RequestBoundApiResultFactory apiResultFactory(Clock systemClock) {
        return new RequestBoundApiResultFactory(systemClock);
    }
}