web-dev-qa-db-ja.com

SpringBootアプリが静的コンテンツを提供しない

Spring Bootを使用しており、デプロイ時に静的リソース(CSS、JS、フォント)を利用できるようにしようとしています。ソースコードは、 https://github.com/joecracko/StaticResourceError から確認または複製できます。

現在、CSS、JS、およびフォントファイルは展開されたWebサイトに表示されません。

これが私のプロジェクトディレクトリ構造です:

Here is my project directory structure

コンパイルされたJARのルートディレクトリは次のとおりです:ファイルがそれぞれのフォルダにあることを確認します。

enter image description here

これが私が見ているネットワークエラーです:

enter image description here

そしてここにchrome tools。によって提供された私のソースがありますbar.cssがここで空に見えることに注意してください。あなたは見るかもしれませんそれが空ではないことを確認するための私のソースコード。

enter image description here

これが私のhomepage.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>

これが私のWebアプリイニシャライザーです(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");
    }
}

これが私のサーブレット構成です(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;
    }
}

そしてキックの場合、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

static resourcesをディレクトリの下に置きます:

/src/main/resources/static

フォルダ名としてpublicの代わりにresourcesまたはstaticを使用することもできます。

説明:ビルドツール(MavenまたはGradle)は、アプリケーションクラスパスの/src/main/resources/からすべてのコンテンツをコピーしますそして Spring Bootのドキュメント に書かれているように、クラスパスの/static(または/publicまたは/resources)と呼ばれるディレクトリからのすべてのコンテンツ静的コンテンツとして提供されます。


このディレクトリも機能する可能性がありますが、お勧めしません。

/src/main/webapp/

アプリケーションがjarとしてパッケージ化される場合は、src/main/webappディレクトリを使用しないでください。このディレクトリは一般的な標準ですが、warパッケージでのみ機能し、jarを生成すると、ほとんどのビルドツールでサイレントに無視されます。

16
Andrea

考慮すべき2つのことがあります(Spring Boot v1.5.2.RELEASE)-1)すべてのコントローラークラスで@EnableWebMvcアノテーションを確認し、存在する場合は削除します2)アノテーションが使用されているコントローラークラスを確認します-@ RestControllerまたは@Controller 。 RestAPIとMVCの動作を1つのクラスに混在させないでください。 MVCの場合は@Controllerを使用し、REST APIの場合は@RestControllerを使用します

上記の2つのことを行うと、私の問題は解決しました。今、私のSpring Bootは、問題なく静的リソースをロードしています。 @Controller => load index.html =>静的ファイルをロードします。

@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