2015-08-22 4 views
1

весна-веб, webmvc 4.1.6 Thymeleaf 2.1О реализации getResource в GenericApplicationContext

Я работаю для Мануалы конфигурации Thymeleaf в SpringBoot. Я хочу установить путь в ServletContextTemplateResolver с префиксом "classpath:". Что я могу сделать для решения этой проблемы?

@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); 
     } 
    } 
} 

Failed 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-INF/ каталога):

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

Обратите внимание, что нет необходимости добавлять к классов: префикса к вашей приставке шаблонов пути, как загрузчик классов распознаватель выглядит по умолчанию в ваш CLASSPATH.

Вам может понадобиться взглянуть на каждом из org.thymeleaf.templateresolver.TemplateResolver подклассов, которые предоставляют различные методы для загрузки ресурсов:

Смежные вопросы