速度在获取模板时投掷NPE

时间:2013-07-24 17:57:33

标签: java apache tomcat jersey velocity

我有一些本地工作正常的代码,但是当我尝试在远程服务器上运行它时,它会抛出一个空指针异常。尝试从Velocity获取模板时会这样做。它第一次失败,每次失败。

有问题的代码是这一点:

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

记录显示了正确的路径,我可以验证该文件是否存在。

用于初始化velocity的属性文件包含:

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

错误的堆栈跟踪如下所示:

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)

我已经用Google搜索并搜索了StackOverflow,但我找不到任何答案。有什么想法吗?

2 个答案:

答案 0 :(得分:6)

属性file.resource.loader.path应指向目录。尝试将其设置为目录/var/lib/tomcat6/webapps/geoip/WEB-INF/templates

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

而不是

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

此外,您似乎还有一个Web应用程序。在这种情况下,最好使用velocity tools

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

并在初始化之前设置servlet context属性

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

其中contextServletContext。目录templates应位于您的网络根目录中,因此位于与WEB-INF相同的位置。

修改

如果您将应用程序打包成war文件并将其部署到未解压缩的应用服务器上,以便您可以直接访问文件系统,那么您可以考虑使用ClasspathResourceLoader。为此,您必须将模板打包到自己的jar文件中,并将其放入WEb-INF/libgetTemplate(...)的参数必须遵循检索类路径中的资源的规则(参见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

Here您可以找到有关如何加载模板的更多信息(a.k.a.资源)。

答案 1 :(得分:1)

我认为这段代码[1]应该更强大。当配置Logging时出现任何错误时,速度引擎会以奇怪的状态结束,其中initialized = false和initializing = true表示应用程序的生命周期。我也不确定为什么Logging首先被初始化而不是资源管理器。我正在考虑为项目打开一个错误。

[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