Spring-boot プロジェクトで静的コンテンツを提供できません。
static
の下にという名前のフォルダを配置しましたsrc/main/resources
。その中に という名前のフォルダがありますimages
。アプリをパッケージ化して実行すると、そのフォルダに配置した画像が見つかりません。
静的ファイルを に配置しようとしましたが、public
何も機能しません。resources
META-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年以上経ってから死者を蘇らせるつもりはありませんが、これまでの回答はすべて、いくつかの重要な点を見逃しています。
@EnableWebMvc
クラスの は無効になりますorg.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
。完全な制御が必要な場合は問題ありませんが、そうでない場合は問題になります。すでに提供されているものに加えて、静的リソース用の別の場所を追加するためのコードを記述する必要はありません。v1.3.0.RELEASE から見ると、で構成できる
org.springframework.boot.autoconfigure.web.ResourceProperties
フィールドがあります。以下はソースからの抜粋です。staticLocations
application.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;
前述のように、リクエスト URL はこれらの場所を基準にして
src/main/resources/static/index.html
解決されます。したがって、リクエスト URL が の場合、 が提供されます/index.html
。Spring 4.1 の時点で、パスの解決を担当するクラスは ですorg.springframework.web.servlet.resource.PathResourceResolver
。サフィックス パターン マッチングはデフォルトで有効になっています。つまり、リクエスト URL の場合
/index.html
、Spring は に対応するハンドラーを探します/index.html
。静的コンテンツを提供することが目的の場合、これは問題になります。これを無効にするには、 を拡張しWebMvcConfigurerAdapter
(ただし は使用しない@EnableWebMvc
)、configurePathMatch
以下のようにオーバーライドします。@Override public void configurePathMatch(PathMatchConfigurer configurer) { super.configurePathMatch(configurer); configurer.setUseSuffixPatternMatch(false); }
私の意見では、コード内のバグを減らす唯一の方法は、可能な限りコードを書かないことです。すでに提供されているものを使用してください。多少の調査が必要であっても、その見返りは価値があります。
2021年7月編集:
WebMvcConfigurerAdapter
Spring 5 以降では非推奨になりました。 を実装しWebMvcConfigurer
てアノテーションを付けます@Configuration
。