すぐにアイデアを通じてプロジェクトをビルドSpringboot:
springbootバージョン2.1.6
次のように情報を表示する行では、静的リソースへのアクセスをspringboot:
"CLASSPATH:/ META-INF /リソース/" 、
"CLASSPATH:/リソース/" 、
"CLASSPATH:/静的/" 、
"CLASSPATH:/公共/"
"/":プロジェクトの現在のルートパス
静的リソースにアクセスする際の試験問題ありませんした後、コードの構成によってリソースにアクセスし、ログインページには、404が登場しました。
インターネット上のアクセスパスを設定するには、application.ymlないようだ(またはプロパティ)静的リソースへのアクセス404、の多くを見つけるために、それは、Configクラスの彼らの定義です。
その後、原因タイムコードの設定で見つかったソースコードを見てください。彼は、継承されたWebMvcConfigurationSupport次のような理由から、全体のアクセスリソースの故障が生じ、このクラス:
最初のステップ:
場所springboot静的リソースへのアクセスを確認し、原因springbootは自動的にそう見つけ、コンフィギュレーションをロードWebMvcAutoConfiguration多くの方法がありますが、この構成のクラスを、
ただ、マッピングリソースの方法を見つけます:
公共 のボイドaddResourceHandlers(ResourceHandlerRegistryレジストリ){ 場合(!この.resourceProperties.isAddMappings()){ logger.debug( "デフォルトのリソースが無効扱い" ); } 他{ 期間cachePeriod = この.resourceProperties.getCache()getPeriod()。 CacheControl cacheControl = この.resourceProperties.getCache()getCachecontrol()toHttpCacheControl()。。。
<! - / webjars / **访问的、资源映射规则- >
もし(!registry.hasMappingForPattern( "/ webjars / **" )){ この.customizeResourceHandlerRegistration(registry.addResourceHandler(新しい文字列[] { " / webjars / ** "})。
addResourceLocations(新しい文字列[] {" クラスパス:/ META-INF /リソース/ webjars /。"})setCachePeriod(これは.getSeconds (cachePeriod))setCacheControl(cacheControl))。 } <! -静态资源映射规则- > 列staticPathPattern = この.mvcProperties.getStaticPathPattern()。 もし(!registry.hasMappingForPattern(staticPathPattern)){ この .customizeResourceHandlerRegistration(registry.addResourceHandler(新文字列[] {staticPathPattern})。
addResourceLocations(getResourceLocations(これ。resourceProperties.getStaticLocations() ))。
setCachePeriod(この.getSeconds(cachePeriod))setCacheControl(cacheControl))。 } } }
最初webjars負荷:資源を見つける/ / META-INF /リソース/ webjars;:すべて/ webjars / **、クラスパスを行ってきました
第二の静的リソースマッピング:
staticPathPattern ソースコードを見るためにクリック:staticPathPattern= / ** ;
resourceProperties.getStaticLocations()のソースコードを見るためにクリック:
プライベート 静的 最終列[] CLASSPATH_RESOURCE_LOCATIONS = 新しい文字列[] { "クラスパス:/ META-INF /リソース/"、 "クラスパス:/リソース/"、 "クラスパス:/静的/"、 "クラスパス:/ /パブリック" }。 プライベートString []型staticLocations。 プライベート ブールaddMappings。 民間 最終ResourceProperties.Chainチェーン。 民間 最終ResourceProperties.Cacheキャッシュ; パブリックResourcePropertiesの(){ この。staticLocations = CLASSPATH_RESOURCE_LOCATIONS。 この.addMappings = 真; この .chain = 新しいResourceProperties.Chain(); この .cache = 新しいResourceProperties.Cache(); } パブリック文字列[] getStaticLocationsは() { 戻り 、これを。staticLocations ; }
テストの開始時間とリソースにアクセスするためのパスとして見上記のソースを通じ、何の問題、なぜ静的な構成設定を通じてリソースにアクセスすることはできません見て何度も何度も、そのページにログインWebMvcAutoConfigurationを次のように見つかったソースを:
@Configuration @ConditionalOnWebApplication(タイプ = Type.SERVLET) @ConditionalOnClass({サーブレット。クラス、のDispatcherServlet。クラス、WebMvcConfigurer。クラス}) @ConditionalOnMissingBean({WebMvcConfigurationSupport。クラス}) @AutoConfigureOrder( -2147483638 ) @AutoConfigureAfter({DispatcherServletAutoConfiguration。クラス、TaskExecutionAutoConfiguration。クラス、ValidationAutoConfiguration。クラス}) パブリック クラス WebMvcAutoConfiguration {=
@ConditionalOnClassと@ConditionalOnMissingBean WebMvcAutoConfigurationが自動的にロードする設定条件の両方注釈
ログインページを設定するときに、単に継承WebMvcConfigurationSupportのクラス
@ConditionalOnMissingBean({ WebMvcConfigurationSupport。クラス}) Beanをロードするときにコンテナが自動的WebMvcAutoConfigurationをロードしない、
継承WebMvcAutoConfigurationの道ができますが、手動でパスをマッピングするためのリソースを追加する必要があり、WebMvcAutoConfiguration他の自動アドインは、独自に対処する必要があります。
@Condition alOnClass({Servlet.class、DispatcherServlet.class、WebMvcConfigurer.classが自動的にロード})容器豆WebMvcAutoConfigurationローディング
改訂構成クラスが実装WebMvcConfigurerのインターフェースログオンページは、通常、静的リソースへのアクセスを処理します。