Dans mes applications Spring Boot (version 1 et 2), mes ressources statiques se trouvent à un seul endroit :
src/main/resources/static
static
étant un dossier reconnu par Spring Boot pour charger les ressources statiques.
L'idée est ensuite de personnaliser la configuration de Spring MVC.
La méthode la plus simple consiste à utiliser la configuration de Spring Java.
Je mets en œuvre WebMvcConfigurer
pour passer outre addResourceHandlers()
. J'ajoute dans un simple ResourceHandler
à l'actuel ResourceHandlerRegistry
.
Le gestionnaire est mappé sur chaque requête et je spécifie classpath:/static/
comme valeur d'emplacement des ressources (vous pouvez bien sûr en ajouter d'autres si nécessaire).
J'ajoute un PathResourceResolver
classe anonyme à surcharger getResource(String resourcePath, Resource location)
.
Et la règle pour retourner la ressource est la suivante : si la ressource existe et est lisible (donc c'est un fichier), je la retourne. Sinon, par défaut, je retourne le fichier index.html
page. Ce qui est le comportement attendu pour gérer les urls HTML 5.
Application Spring Boot 1.X :
Extension du site org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
est le chemin.
Cette classe est un adaptateur de la WebMvcConfigurer
interface avec des méthodes vides permettant aux sous-classes de ne surcharger que les méthodes qui les intéressent.
Voici le code complet :
import java.io.IOException;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.resource.PathResourceResolver;
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**/*")
.addResourceLocations("classpath:/static/")
.resourceChain(true)
.addResolver(new PathResourceResolver() {
@Override
protected Resource getResource(String resourcePath,
Resource location) throws IOException {
Resource requestedResource = location.createRelative(resourcePath);
return requestedResource.exists() && requestedResource.isReadable() ? requestedResource
: new ClassPathResource("/static/index.html");
}
});
}
}
Application Spring Boot 2.X :
org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
a été déprécié.
Mise en œuvre directe WebMvcConfigurer
est la solution actuelle, car il s'agit toujours d'une interface, mais elle possède désormais des méthodes par défaut (rendues possibles par une ligne de base de Java 8) et peut être implémentée directement sans avoir besoin de l'adaptateur.
Voici le code complet :
import java.io.IOException;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.resource.PathResourceResolver;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**/*")
.addResourceLocations("classpath:/static/")
.resourceChain(true)
.addResolver(new PathResourceResolver() {
@Override
protected Resource getResource(String resourcePath,
Resource location) throws IOException {
Resource requestedResource = location.createRelative(resourcePath);
return requestedResource.exists() && requestedResource.isReadable() ? requestedResource
: new ClassPathResource("/static/index.html");
}
});
}
}
0 votes
Votre route angulaire devrait ressembler à localhost:8080\#dashboard et localhost:8080\#dashboard \detail
0 votes
Salut @tashi, j'aimerais éviter d'utiliser des hachages si possible... J'ai mis à jour le sujet pour refléter cela.. Je n'ai pas été assez clair la première fois...
0 votes
Non, utilisez simplement le style html