J'utilise Spring Boot et j'essaie de rendre mes ressources statiques (CSS, JS, Fonts) disponibles lors du déploiement. Le code source peut être consulté ou cloné à partir de https://github.com/joecracko/StaticResourceError .
Actuellement, mes fichiers CSS, JS et Font ne sont pas visibles sur mon site Web déployé.
Voici la structure de mon répertoire de projet:
Voici le répertoire racine du JAR compilé: Je vous assure que les fichiers sont présents dans leurs dossiers respectifs.
Voici l'erreur réseau que je constate:
Et voici mes sources fournies par les outils de chrome. Notez que bar.css semble vide ici. Vous pouvez regarder mon code source pour voir qu'il n'est pas vide.
Voici ma page d'accueil.html
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Insert title here</title>
<!-- Main Styles -->
<link rel="stylesheet" href="/css/bar.css" />
<script src="/js/foo.js"></script>
</head>
<body>
<div>Welcome to Foo!</div>
</body>
</html>
Voici mon initialiseur Web App (FooWebAppInitializer.Java)
public class FooWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(ServletConfig.class);
// Manage the lifecycle of the root application context
container.addListener(new ContextLoaderListener(rootContext));
//Spring Security
container.addFilter("springSecurityFilterChain", new DelegatingFilterProxy("springSecurityFilterChain"))
.addMappingForUrlPatterns(null, false, "/*");
// Register and map the dispatcher servlet
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcherServlet", new DispatcherServlet(rootContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
dispatcher.addMapping("*.css");
dispatcher.addMapping("*.eot");
dispatcher.addMapping("*.svg");
dispatcher.addMapping("*.ttf");
dispatcher.addMapping("*.woff");
dispatcher.addMapping("*.map");
dispatcher.addMapping("*.js");
dispatcher.addMapping("*.ico");
}
}
Voici ma configuration de servlet (ServletConfig.Java)
@Configuration
@EnableWebMvc
@ComponentScan({"com.foo"})
public class ServletConfig extends WebMvcAutoConfiguration{
@Bean
MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasename("messages");
return source;
}
}
Et pour le plaisir, My Spring Security Config (WebSecurityConfig.Java)
@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().permitAll();
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/resources/**"); // #3
}
}
Mettez ressources statiques sous le répertoire:
/src/main/resources/static
Vous pouvez également utiliser public
ou resources
au lieu de static
comme nom de dossier.
Explication : votre outil de construction (Maven ou Gradle) copiera tout le contenu de /src/main/resources/
dans l'application classpath et, comme indiqué dans la documentation de Spring Boot , tout le contenu de un répertoire appelé /static
(ou /public
ou /resources
) dans le chemin d'accès aux classes sera servi comme contenu statique.
Ce répertoire pourrait également fonctionner, mais il est déconseillé:
/src/main/webapp/
N'utilisez pas le répertoire src/main/webapp si votre application sera conditionnée en tant que jar. Bien que ce répertoire soit une norme commune, Ne fonctionnera qu'avec les emballages de guerre et L'ignorera silencieusement de la plupart des outils de génération si vous générez un fichier jar.
Il y a 2 choses à considérer (Spring Boot v1.5.2.RELEASE) - 1) Vérifiez l’annotation @EnableWebMvc dans toutes les classes de contrôleurs, supprimez-la s’il existe 2) Vérifiez la classe de contrôleurs pour quelle annotation est utilisée - @RestController ou @Controller. Ne mélangez pas les comportements Rest API et MVC dans une classe. Pour MVC, utilisez @Controller et pour REST API, utilisez @RestController.
Faire au-dessus de 2 choses a résolu mon problème. Maintenant, mon démarrage de printemps charge des ressources statiques sans aucun problème. @ Controller => load index.html => charge les fichiers statiques.
@Controller
public class WelcomeController {
// inject via application.properties
@Value("${welcome.message:Hello}")
private String message = "Hello World";
@RequestMapping("/")
public String home(Map<String, Object> model) {
model.put("message", this.message);
return "index";
}
}
index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet/less" th:href="@{/webapp/assets/theme.siberia.less}"/>
<!-- The app's logic -->
<script type="text/javascript" data-main="/webapp/app" th:src="@{/webapp/libs/require.js}"></script>
<script type="text/javascript">
require.config({
paths: { text:"/webapp/libs/text" }
});
</script>
<!-- Development only -->
<script type="text/javascript" th:src="@{/webapp/libs/less.min.js}"></script>
</head>
<body>
</body>
</html>