Velocity Throwing NPE lors de l’obtention du template

J’ai du code qui fonctionne très bien localement, mais lorsque j’essaie de l’exécuter sur mon serveur distant, il génère une exception de pointeur nul. Il le fait en essayant d’obtenir le modèle de Velocity. Il échoue la première fois et chaque fois après.

Le code en question est ce bit:

URL location = Thread.currentThread().getContextClassLoader().getResource("velocity.properties"); Ssortingng fullPath = location.getPath(); log.debug("Path: " + fullPath); Velocity.init(fullPath); Template tmplt = Velocity.getTemplate( "template.html" ); //This line throws the error 

La journalisation montre que le chemin est correct et je peux vérifier que le fichier est bien là.

Le fichier de propriétés utilisé pour initialiser vélocité contient:

 resource.loader = file file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader file.resource.loader.path=/var/lib/tomcat6/webapps/geoip/WEB-INF/templates/template.html file.resource.loader.cache = true input.encoding=UTF-8 output.encoding=UTF-8 

La trace de la stack pour l’erreur ressemble à ceci:

 SEVERE: Servlet.service() for servlet Jersey REST Service threw exception java.lang.NullPointerException at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1533) at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1514) at org.apache.velocity.runtime.RuntimeSingleton.getTemplate(RuntimeSingleton.java:299) at org.apache.velocity.app.Velocity.getTemplate(Velocity.java:358) at ca.company.ipservice.models.MyClass.toHTML(MyClass.java:48) 

J’ai cherché Google et cherché StackOverflow mais je ne trouve aucune réponse. Des idées?

La propriété file.resource.loader.path doit pointer vers un répertoire. Essayez de le définir dans le répertoire /var/lib/tomcat6/webapps/geoip/WEB-INF/templates

 file.resource.loader.path=/var/lib/tomcat6/webapps/geoip/WEB-INF/templates 

au lieu de

 file.resource.loader.path=/var/lib/tomcat6/webapps/geoip/WEB-INF/templates/template.html 

Vous semblez aussi avoir une application web. Dans ce cas, il est préférable d’utiliser WebappResourceLoader partir des outils de vélocité.

 resource.loader = webapp webapp.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader webapp.resource.loader.path = templates webapp.resource.loader.cache = false 

et définissez la propriété de contexte de servlet avant de l’initialiser

 VelocityEngine velocityEngine = new VelocityEngine(); velocityEngine.setApplicationAtsortingbute("javax.servlet.ServletContext", context); 

context est le ServletContext . Les templates répertoire doivent être situés dans votre racine Web, donc au même endroit que WEB-INF .

MODIFIER

Si vous empaquetez votre application dans un fichier war et que vous la déployez sur le serveur d’applications qui ne la décompresse pas afin que vous ayez un access direct au système de fichiers, vous pouvez envisager d’utiliser ClasspathResourceLoader . Pour cela, vous devrez empaqueter vos modèles dans un fichier jar et le placer dans WEb-INF/lib . L’argument de getTemplate(...) devra suivre la règle de récupération des ressources situées dans le classpath (voir ClassLoader # getResourceAsStream ).

 resource.loader = classpath classpath.resource.loader.description = Velocity Classpath Resource Loader classpath.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader classpath.resource.loader.cache = false 

Vous trouverez ici plus d’informations sur le chargement des modèles.

Je pense que ce code [1] devrait être plus robuste. En cas d’erreur lors de la configuration de la journalisation, le moteur de vélocité se retrouve dans l’état étrange dans lequel initialized = false et initializing = true pour la durée de vie de votre application. Je ne sais pas non plus pourquoi la journalisation est initialisée en premier lieu par le gestionnaire de ressources. Je pense à ouvrir un bug au projet.

[1] http://grepcode.com/file/repository.springsource.com/org.apache.velocity/com.springsource.org.apache.velocity/1.6.2/org/apache/velocity/runtime/RuntimeInstance.java # RuntimeInstance.init% 28% 29