Caching für WebJars 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
}
}