2017-05-26 11 views
1

私はSpring MVC 4.2.xプロジェクトを持っています。 Webjarsロケータのdoesn - webjars-locatorXMLベースのSpring MVC 4.2.x構成ではWebjars-locatorは機能しませんか?

<mvc:resources mapping="/webjars/**" location="/webjars/"/> 
<mvc:annotation-driven/> 

すべては一つのことを除いて正常に動作します:私は資源とannotation-drivenモードを設定しているcontext.xmlファイルで

<servlet> 
    <servlet-name>foo</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/context.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

:私はXMLベースの設定ファイルを経由して、それを構成していますすべての作業はです。


私は、間違って起こっているのかを理解するためにSpring MVCのソースに表情を開始し、見つけたそのResourceChainRegistration.getResourceResolvers()クラスメソッドで追加されたのオブジェクトWebJarsResourceResolverクラスを通じてwebjars-locator作品。

フルシーケンスは次のようになります。それは次のように追加され

WebMvcConfigurationSupport.resourceHandlerMapping() >>ResourceHandlerRegistration.getHandlerMapping() >>ResourceHandlerRegistration.getRequestHandler() >> ResourceChainRegistration.getResourceResolvers()、:

if (isWebJarsAssetLocatorPresent) { 
    result.add(new WebJarsResourceResolver()); 
} 

問題は、XMLの場合の構成をベースということですこのシーケンスは呼び出されず、WebMvcConfigurationSupportクラスも使用されません。

さらに、私はプロジェクトに

@EnableWebMvc 
@Configuration 
public class WebConfig { 
} 

WebMvcConfigurationSupportは明らかに動作しますが、ResourceHandlerRegistration.getHandlerMapping()に追加する場合:

protected AbstractHandlerMapping getHandlerMapping() { 
    if (registrations.isEmpty()) { 
     return null; 
    } 
... 
} 

registrationsは空です!結局のところ


、強制スプリングレゾルバチェーンにWebJarsResourceResolverを追加できるようにする方法が唯一の方法である:

1)context.xml

2から<mvc:resources mapping="/webjars/**" location="/webjars/"/>を削除)addResourceHandlersを追加WebConfig

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry 
      .addResourceHandler("/webjars/**") 
      .addResourceLocations("/webjars/") 
      .setCachePeriod(3600) 
      .resourceChain(true) // !!! very important 
    ; 
} 

私の質問はです:私は間違っていますか?なぜXMLベースの設定でWebJarsResourceResolverが登録されないのですか?

答えて

1

コンテキストルートパスが/ctxであるとします。あなたの設定では、/webjars/RESOURCEのようなリソースパスは、実際には/ctx/webjars/RESOURCEにマップされます。一般的な予想とは逆に、/webjars/RESOURCEにマップする必要があります。

Spring 4.2.x documentationan example similar issueに基づいて、デフォルトのディスパッチャサーブレットに/webjars/**をマップする必要がありますよう:

これは(したがって、コンテナのデフォルトサーブレットのマッピングをオーバーライド)「/」にのDispatcherServletをマッピングすることができます、静的リソース要求をコンテナのデフォルトサーブレットで処理できるようにします。 URLマッピング「/ **」を持ち、他のURLマッピングとの相対的な優先順位が最も低いDefaultServletHttpRequestHandlerを構成します。問題を修正する必要があり、以下を追加することを意味

<mvc:resources mapping="/webjars/**" location="/webjars/"> 
    <mvc:resource-chain> 
     <mvc:resource-cache /> 
    </mvc:resource-chain> 
</mvc:resources> 
<mvc:annotation-driven /> 
<mvc:default-servlet-handler /> 

the example petclinicで別のノートでは、私はここでは関係あるかわからないwebjarsためlocation="classpath:/META-INF/resources/webjars/"使用しています。

これが役に立ちます。 @Andremoniyに追加


<mvc:resources mapping="/webjars/**" location="/webjars/"> 
    <mvc:resource-chain resource-cache="true"/> 
</mvc:resources> 
+1

ハ:Spring 4ため

それがわずかに異なるマークアップを持っています!ですから、問題は ''のみであり、XMLで指定するこの明白な方法はわかりませんでした。これはまだwebjarの文書に記述されていない理由には答えませんが、問題を解決する方法として、私はそれを受け入れます! – Andremoniy

関連する問題