5

我有一些在本地运行良好的代码,但是当我尝试在远程服务器上运行它时,它会引发空指针异常。它在尝试从 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

日志显示路径正确,我可以验证文件是否存在。

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

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)

我用谷歌搜索并搜索了 StackOverflow,但找不到任何答案。有任何想法吗?

4

2 回答 2

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 应用程序。在这种情况下,最好使用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 上下文属性

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

context在哪里ServletContext。该目录templates应位于您的 Web 根目录中,因此与WEB-INF.

编辑

如果您将应用程序打包成一个 war 文件并将其部署到不解包它的应用服务器上,以便您可以直接访问文件系统,那么您可能会考虑使用ClasspathResourceLoader. 为此,您必须将模板打包到自己的 jar 文件中,然后将其放入WEb-INF/lib. for 的参数getTemplate(...)必须遵循检索位于类路径中的资源的规则(请参阅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

在这里您可以找到有关如何加载模板(又名资源)的更多信息。

于 2013-07-24T18:18:04.250 回答
1

我认为这段代码[1] 应该更健壮。当配置日志记录出现任何错误时,速度引擎最终会处于奇怪的状态,在您的应用程序的整个生命周期中,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

于 2014-05-17T00:05:59.213 回答