FileNotFoundException, загружая freemarker шаблон на Яве

Я получаю файл, не найденный исключением, загружая freemarker шаблон даже при том, что шаблон на самом деле присутствует в пути.

Обновление: Это бежит как веб-сервис. Это возвратит xml клиенту на основе поискового запроса. Шаблон загружает успешно, когда я называю его из другой явской программы (от статического основного). Но, когда запросы клиента о xml, FileNotFoundException происходит.

OS: Windows 7 Абсолютный путь файла: C:/Users/Jay/workspace/WebService/templates/

Вот мой код:

private String templatizeQuestion(QuestionResponse qr) throws Exception
{
    SimpleHash context = new SimpleHash();
    Configuration config = new Configuration();

    StringWriter out = new StringWriter();

    Template _template = null;

    if(condition1)
    {           
        _template = config.getTemplate("/templates/fibplain.xml");
    } 
    else if(condition2)
    {
        _template = config.getTemplate("/templates/mcq.xml");
    }
    context.put("questionResponse", qr);
    _template.process(context, out);

    return out.toString();
 }

Полная ошибочная стопка:

 java.io.FileNotFoundException: Template /templates/fibplain.xml not found.
at freemarker.template.Configuration.getTemplate(Configuration.java:495)
at freemarker.template.Configuration.getTemplate(Configuration.java:458)
at com.hm.newAge.services.Curriculum.templatizeQuestion(Curriculum.java:251)
at com.hm.newAge.services.Curriculum.processQuestion(Curriculum.java:228)
at com.hm.newAge.services.Curriculum.processQuestionList(Curriculum.java:210)
at com.hm.newAge.services.Curriculum.getTest(Curriculum.java:122)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:212)
at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:117)
at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172)
at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:146)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
10
nl ja de
Пожалуйста, проверьте мое обновление в вопрос.
добавлено автор jaykumarark, источник
каков абсолютный путь файла? который OS?
добавлено автор Bhavik Shah, источник

3 ответы

Пути шаблона FreeMarker решены TemplateLoader объект, который необходимо определить в Конфигурация объект. Путь, который вы определяете как путь шаблона, интерпретируется TemplateLoader и обычно относительно некоторого основного справочника (даже если это начинается с /), это также назвало корневой каталог шаблона поэтому. В вашем примере вы не определили никакой TemplateLoader , таким образом, вы используете дефолт TemplateLoader , который является только там для прежней совместимости, и почти бесполезен (и также опасен). Так, сделайте что-то вроде этого:

config.setDirectoryForTemplateLoading(new File(
    "C:/Users/Jay/workspace/WebService/templates"));

и затем:

config.getTemplate("fibplain.xml");

Обратите внимание, что /шаблон префикс не там теперь, как путь шаблона относительно C:/Users/Jay/workspace/WebService/templates . (Это также означает, что шаблон не может отступить из него с ../-s, который может быть важен для безопасности.)

Вместо того, чтобы загрузить из реального справочника, можно также загрузить шаблоны от SerlvetContext , от "пути к классу", и т.д. Все это зависит, на каком TemplateLoader вы выбираете.

See also: http://freemarker.org/docs/pgui_config_templateloading.html

Обновление: Если вы добираетесь FileNotFoundException вместо TemplateNotFoundException , пора модернизировать FreeMarker до по крайней мере 2.3.22. Это также дает лучшие сообщения об ошибках, как то, если вы делаете типичную ошибку использования дефолта TemplateLoader , это говорит вам что прямо в сообщении об ошибке. Менее потраченное впустую время разработчика.

25
добавлено
Я решил проблему, с которой я сталкивался. Когда я управлял приложением как axis2 веб-сервисом от затмения, оно рассмотрело инсталляционную папку затмения как корневую папку шаблона вместо корневой папки проекта. Так, чтобы созданный весь беспорядок. Но то, что говорят u, имеет смысл. Есть ли способ изменить корневой каталог применения во времени выполнения или где-нибудь в параметрах настройки проекта?
добавлено автор jaykumarark, источник
эй чувак спасибо. Я испытал config.setDirectoryForTemplateLoading , и это хорошо работало, когда я управлял веб-сервисом.:)
добавлено автор jaykumarark, источник
stackoverflow.com/questions/3019424/… работал на меня.
добавлено автор SparX, источник
Спасибо. Я сходил с ума, потому что я мог энергия файл, но я получал файл, не найденный исключением... Это зафиксировало его для меня!
добавлено автор nterry, источник
Как я сказал, вы устанавливаете корневой каталог шаблона, устанавливая TemplateLoader в Конфигурация , потому что it' s TemplateLoader , который определяет корень шаблона. setDirectoryForTemplateLoading является просто удобным методом, универсальная форма confg.setTemplateLoader (новый WhateverTemplateLoader (...)) . Необходимо установить его везде, где вы настраиваете Конфигурацию объект. Обычно вы делаете это только однажды в жизненном цикле приложения, тогда все нити разделяют тот же самый Конфигурация объект.
добавлено автор ddekany, источник
Большое спасибо.
добавлено автор Quick_Silver, источник

Можно решить эту проблему как этот.

public class HelloWorldFreeMarkerStyle {
    public static void main(String[] args) {

         Configuration configuration = new Configuration();

         configuration.setClassForTemplateLoading(HelloWorldFreeMarkerStyle.class, "/");



        FileTemplateLoader templateLoader = new FileTemplateLoader(new File("resources"));
        configuration.setTemplateLoader(templateLoader);

        Template helloTemp= configuration.getTemplate("hello.ftl");
        StringWriter writer = new StringWriter();
        Map helloMap = new HashMap();
        helloMap.put("name","gokhan");

        helloTemp.process(helloMap,writer);

        System.out.println(writer);


    }   
}
5
добавлено

Явский VM не в состоянии найти, что вы регистрируете /templates/fibplain.xml в указанном месте. Это абсолютный путь , и очень вероятно, что вы перепутаны с относительный путь . Получить это исправленное использование полное (т.е. абсолютный) путь правильно как /home/jaykumar/templates/fibplan.xml ($TEMPLATE_HOME/fibplan.xml) . Другая возможность была бы, если вы действительно имеете такое расположение как/шаблоны/, вы, возможно, не поместили fibplain.xml в местоположение. Мне только эти два - самые вероятные причины. Я предположил, что это - один из дистрибутива Linux из-за сепаратора, /

0
добавлено
У меня была проблема u указанный ранее. Я решил его. Я детализировал новую проблему в своем вопросе с обновлением. пожалуйста, прокомментируйте свои взгляды
добавлено автор jaykumarark, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

IDE и редакторы — русскоговорящее сообщество
IDE и редакторы — русскоговорящее сообщество
393 участник(ов)

Общаемся, сравниваем и помогаем друг другу решать задачи с продуктами JetBrains, VS Code, Atom, vim, Emacs, Sublime и т.д. Всё в одном месте, ведь каждый из них хорош по своему. См. также: @js_ru, @typescript_ru, @react_js, @nodejs_ru, @javascript_jobs

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async