2015-08-22 33 views
1

彈簧網,webmvc 4.1.6 Thymeleaf 2.1關於在GenericApplicationContext實施的getResource的

我一直在SpringBoot Thymeleaf的manualy配置。 我想用「classpath:」前綴在ServletContextTemplateResolver中設置路徑。 我該怎麼處理這個問題?

@Bean 
public ServletContextTemplateResolver templateResolver() { 
    ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(); 
    templateResolver.setPrefix("classpath:/templates/"); 
    templateResolver.setSuffix(".html"); 
    templateResolver.setTemplateMode("HTML5");   
    templateResolver.setCacheable(false); 
    return templateResolver; 
} 

但它不起作用。原因是下面的代碼。 在org.springframework.context.support.GenericApplicationContext

@Override 
public Resource getResource(String location) { 
    if (this.resourceLoader != null) { 
     return this.resourceLoader.getResource(location); // with setting of template resolver 
    } 
    return super.getResource(location); // without setting of template resolver 
} 

沒有ServletContextTemplateResolver的任何設置, GenericApplicationContext.getResource被調用。

設置它 StandardRoot.getResourceAsStream被調用。 但是這種方法沒有實現支持「class:」前綴。


成功到的getResource

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/support/GenericApplicationContext.html#getResource-java.lang.String-

「使用ClassPathResource被實現」

@Override 
public Resource getResource(String location) { 
    Assert.notNull(location, "Location must not be null"); 
    if (location.startsWith("/")) { 
     return getResourceByPath(location); 
    } 
    else if (location.startsWith(CLASSPATH_URL_PREFIX)) { 
     return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader()); 
    } 
    else { 
     try { 
      // Try to parse the location as a URL... 
      URL url = new URL(location); 
      return new UrlResource(url); 
     } 
     catch (MalformedURLException ex) { 
      // No URL -> resolve as resource path. 
      return getResourceByPath(location); 
     } 
    } 
} 

失敗的getResource

https://tomcat.apache.org/tomcat-8.0-doc/api/org/apache/catalina/webresources/StandardRoot.html#getResource(java.lang.String)

在這段代碼,前綴不落實的話,我意識到,我不能用「類:」前綴ServletContextTemplateResolver的財產。

在org.apache.catalina.webresources.StandardRoot

@Override 
public InputStream getResourceAsStream(String path) { 

    if (path == null) 
     return (null); 

    if (!path.startsWith("/") && GET_RESOURCE_REQUIRE_SLASH) 
     return null; 

    WebResourceRoot resources = context.getResources(); 
    if (resources != null) { 
     return resources.getResource(path).getInputStream(); 
    } 

    return null; 
} 

回答

3

爲了與可選支持加載您的模板作爲類路徑項目的前綴路徑,你應該使用ClassLoaderResourceResolver,而不是ServletContextTemplateResolver(後者做出決議tempaltes相對於你的web應用程序上下文即,在/WEB-INF/目錄下):

@Bean 
public ServletContextTemplateResolver templateResolver() { 
    ITemplateResolver templateResolver = new ClassLoaderTemplateResolver(); 
    templateResolver.setPrefix("templates/"); 
    templateResolver.setSuffix(".html"); 
    templateResolver.setTemplateMode("HTML5");   
    templateResolver.setCacheable(false); 
    return templateResolver; 
} 

注意,沒有必要追加類路徑:前綴爲您的模板路徑前綴,如類加載器解析看上去默認到您的類路徑。

您可能需要看一看每個org.thymeleaf.templateresolver.TemplateResolver子這提供不同的技術來加載資源: