Spring Boot が静的コンテンツを提供しない 質問する

Spring Boot が静的コンテンツを提供しない 質問する

Spring-boot プロジェクトで静的コンテンツを提供できません。

staticの下にという名前のフォルダを配置しましたsrc/main/resources。その中に という名前のフォルダがありますimages。アプリをパッケージ化して実行すると、そのフォルダに配置した画像が見つかりません。

静的ファイルを に配置しようとしましたが、public何も機能しません。resourcesMETA-INF/resources

jar -tvf app.jarを実行すると、jar内の正しいフォルダにあるファイルを確認できます。/static/images/head.pngたとえば、次のように呼び出すとhttp://localhost:8080/images/head.png、次のような結果が表示されます。404

spring-boot がこれを見つけられない理由について何か考えはありますか? (ちなみに私は 1.1.4 を使用しています)

ベストアンサー1

1年以上経ってから死者を蘇らせるつもりはありませんが、これまでの回答はすべて、いくつかの重要な点を見逃しています。

  1. @EnableWebMvcクラスの は無効になりますorg.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration。完全な制御が必要な場合は問題ありませんが、そうでない場合は問題になります。

  2. すでに提供されているものに加えて、静的リソース用の別の場所を追加するためのコードを記述する必要はありません。v1.3.0.RELEASE から見ると、で構成できるorg.springframework.boot.autoconfigure.web.ResourcePropertiesフィールドがあります。以下はソースからの抜粋です。staticLocationsapplication.properties

    /**
     * Locations of static resources. Defaults to classpath:[/META-INF/resources/,
     * /resources/, /static/, /public/] plus context:/ (the root of the servlet context).
     */
    private String[] staticLocations = RESOURCE_LOCATIONS;
    
  3. 前述のように、リクエスト URL はこれらの場所を基準にしてsrc/main/resources/static/index.html解決されます。したがって、リクエスト URL が の場合、 が提供されます/index.html。Spring 4.1 の時点で、パスの解決を担当するクラスは ですorg.springframework.web.servlet.resource.PathResourceResolver

  4. サフィックス パターン マッチングはデフォルトで有効になっています。つまり、リクエスト URL の場合/index.html、Spring は に対応するハンドラーを探します/index.html。静的コンテンツを提供することが目的の場合、これは問題になります。これを無効にするには、 を拡張しWebMvcConfigurerAdapter(ただし は使用しない@EnableWebMvc)、configurePathMatch以下のようにオーバーライドします。

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        super.configurePathMatch(configurer);
    
        configurer.setUseSuffixPatternMatch(false);
    }
    

私の意見では、コード内のバグを減らす唯一の方法は、可能な限りコードを書かないことです。すでに提供されているものを使用してください。多少の調査が必要であっても、その見返りは価値があります。

2021年7月編集:

  1. WebMvcConfigurerAdapterSpring 5 以降では非推奨になりました。 を実装しWebMvcConfigurerてアノテーションを付けます@Configuration

おすすめ記事