2015-09-20 2 views
1

Я хочу развернуть несколько шаблонов Freemarker с помощью java-приложения Google App Engine для использования в качестве шаблонов шаблонов электронной почты. Я использую freemarker-gae-2.3.23.jar.ServletContext в Google App Engine

Мой вопрос в том, где в файле войны я должен разместить файлы шаблонов так, чтобы класс конфигурации Freemarker мог их найти? Я думал, что WEB-INF/classes/templates будут работать, но я получаю следующую ошибку, когда запускаю ее на примере GAE. getRealPath() также не дает понимания. Пустая строка возвращается. Любые мысли или предложения очень ценятся.

SEVERE: Template ./templates/invitation.ftl not found. 
java.lang.RuntimeException: Error in loading ftl template: Template ./templates/invitation.ftl not found. 

Моя основная конфигурация выглядит следующим образом:

public class FreeMarkerConfig { 

private static FreeMarkerConfig freeMarkerConfig = null; 
private static Configuration cfg = null; 
private static final Logger logger = Logger.getLogger(FreeMarkerConfig.class.getName()); 

private FreeMarkerConfig(ServletContext context){ 
    cfg = new Configuration(); 
    cfg.setServletContextForTemplateLoading(context, "/templates"); 
} 

public static FreeMarkerConfig getInstance(ServletContext context){ 
    if(freeMarkerConfig == null){ 

     freeMarkerConfig = new FreeMarkerConfig(context); 
     return freeMarkerConfig; 
    } 
    return freeMarkerConfig; 
} 

public static Template getTemplateByName(String fileName){ 
    try { 
     return cfg.getTemplate(fileName); 
    } catch(IOException e) { 
     logger.severe(e.getMessage()); 
     e.getStackTrace(); 
     throw new RuntimeException("Error in loading ftl template: "+e.getMessage()); 
    } 
} 
} 

EDIT: Решение было два раза. Местоположение контекста - это «веб-каталог». Поэтому настройка конфигурации freemarker с этой проблемой устранена.

private FreeMarkerConfig(ServletContext context){ 
    cfg = new Configuration(); 
    cfg.setServletContextForTemplateLoading(context, "/WEB-INF/classes/templates/"); 
} 

В качестве второго полезного совета я нашел, что я должен был просить шаблон только с именем шаблона, а не именем файла. т. е. приглашение, а не приглашение.ftl

+0

Решение, указанное в РЕДАКТОРЕ выше. – mba12

+1

вы должны добавить EDIT в качестве ответа на свой вопрос. – Titus

ответ

1

Решение было в два раза. Местоположение контекста - это «веб-каталог». Таким образом, установив конфигурацию freemarker, это устранило проблему.

private FreeMarkerConfig(ServletContext context){ 
    cfg = new Configuration(); 
    cfg.setServletContextForTemplateLoading(context, "/WEB-INF/classes/templates/"); 
    } 

В качестве второго полезного совета я обнаружил, что мне нужно было запросить шаблон только с именем шаблона, а не с именем файла. то есть приглашение, а не приглашение.ftl