FileNotFoundException lors du chargement du modèle Freemarker dans Java
J'obtiens un fichier non trouvé exception pendant le chargement d'un template freemarker, même si le modèle est effectivement présent dans le path.
Mise à jour: il s'exécute comme un service web. Il sera de retour un xml pour le client sur la base d'une requête de recherche. Le modèle se charge correctement, quand je l'appelle à partir d'un autre programme java(à partir de la statique principal). Mais quand le client demande pour le xml, FileNotFoundException se produit.
Système d'exploitation: Windows 7
Chemin d'accès absolu du fichier: C:/Users/Jay/workspace/WebService/templates/
Voici mon code:
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();
}
Plein D'Erreur De Pile:
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)
source d'informationauteur jaykumarark
Vous devez vous connecter pour publier un commentaire.
Le template FreeMarker chemins sont résolus par un
TemplateLoader
objet, vous devez spécifier dans leConfiguration
objet. Le chemin que vous spécifiez le chemin d'accès du modèle est interprété par leTemplateLoader
et est généralement par rapport à une sorte de répertoire de base (même si elle commence avec/
), qui est aussi appelé le modèle de répertoire racine pour cette raison. Dans votre exemple, vous n'avez pas précisé de quelleTemplateLoader
si vous utilisez la valeur par défautTemplateLoader
qui n'est là que pour des raisons de compatibilité descendante, et est à peu près inutile (et dangereux). Donc, faire quelque chose comme ceci:et puis:
Noter que le
/template
préfixe n'est pas là maintenant, comme le modèle le chemin est relatifC:/Users/Jay/workspace/WebService/templates
. (Cela signifie également que le modèle ne peut pas en arrière avec../
-s, qui peut être important pour la sécurité.)Au lieu de chargement à partir d'un répertoire réel, vous pouvez également charger des modèles à partir d'un
SerlvetContext
à partir du "chemin d'accès de classe", etc. Tout dépend de ce queTemplateLoader
que vous choisissez.Voir aussi: http://freemarker.org/docs/pgui_config_templateloading.html
Mise à jour: Si vous obtenez
FileNotFoundException
au lieu deTemplateNotFoundException
il est temps de mettre à niveau FreeMarker au moins 2.3.22. Il donne aussi de meilleurs messages d'erreur, comme si vous ne l'erreur typique de l'utilisation de la valeur par défautTemplateLoader
il vous dit que droit dans le message d'erreur. Moins de perte de temps dans le révélateur.Vous pouvez résoudre ce problème comme ça.
La machine virtuelle Java n'est pas en mesure de vous trouver le fichier
/templates/fibplain.xml
dans l'emplacement spécifié. C'estan absolute path
et il est très probable que vous êtes confus avecrelative path
. Pour obtenir ce corrigé utiliser la totalité de la (j'.e absolue) chemin correctement comme/home/jaykumar/templates/fibplan.xml($TEMPLATE_HOME/fibplan.xml)
. Autre possibilité serait, si vous possédez un tel emplacement /templates/, vous pourriez ne pas avoir mis fibplain.xml dans l'emplacement. Qu'à moi, ces deux sont les plus plausibles raisons. J'ai supposé que c'est l'un de la distribution linux à cause du séparateur est/