Caching für WebJar Ressourcen in Spring Boot konfigurieren

Für einfache Spring Boot basierte Webanwendungen greife ich häufig auf WebJars zurück. WebJars bieten die Möglichkeit, diverse JavaScript und CSS Bibliotheken wie z.B. jQuery oder Bootstrap als Abhängigkeit in Form einer JAR-Datei einzubinden. Spring Boot unterstützt WebJars von Haus aus, allerdings sollte das Caching für die WebJar Ressourcen konfiguriert werden, um möglichst kurze Ladezeiten für den Client zu erreichen.

Konfiguration ohne webjars-locator

Wer WebJars ohne den webjars-locator einbindet, kann folgende Konfiguration nutzen:

import java.util.concurrent.TimeUnit;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {

        // @formatter:off
        registry
            .addResourceHandler("/webjars/**")
            .addResourceLocations("classpath:/META-INF/resources/webjars/")
            .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS));
        // @formatter:on

    }

}

Konfiguration mit webjars-locator

Bei der Verwendung des webjars-locator muss hingegen folgende Konfiguration vorgenommen werden:

import java.util.concurrent.TimeUnit;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.resource.WebJarsResourceResolver;
import org.webjars.WebJarAssetLocator;

@Configuration
class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {

        // @formatter:off
        registry
            .addResourceHandler("/webjars/**")
            .addResourceLocations("classpath:/META-INF/resources/webjars/")
            .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS))
            .resourceChain(true).addResolver(new WebJarsResourceResolver(new WebJarAssetLocator()));
        // @formatter:on

    }

}