web-dev-qa-db-fra.com

L'application Spring Boot ne sert pas de contenu statique

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:

Here is my project directory structure

Voici le répertoire racine du JAR compilé: Je vous assure que les fichiers sont présents dans leurs dossiers respectifs.

enter image description here

Voici l'erreur réseau que je constate:

enter image description here

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.

enter image description here

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
    }
}
8

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.

16
Andrea

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>
1
gjp