开发者社区> 问答> 正文

Apache Velocity 2.0如何编写自定义资源加载器?

ResourceLoaderAPI文档中有一个类:

https://velocity.apache.org/engine/2.0/apidocs/org/apache/velocity/runtime/resource/loader/ResourceLoader.html

我想实现自己的加载器,因为我需要从数据库中加载模板,但是要使用上下文相关的方式(换句话说:无法使用DataSourceResourceLoader,我需要编写自定义代码以从数据库中选择“正确的”模板)。数据库)。

似乎ResourceLoader有一些抽象方法,而且似乎也可以通过实现这些抽象方法来编写自定义加载程序。但是我看不到任何向引擎添加新加载程序的方法。没有“ addResourceLoader”方法。该文档仅显示了如何配置Velocity内置的装载程序:

https://velocity.apache.org/engine/2.0/developer-guide.html#resource-loaders

主要问题:如何向VelocityEngine(或VelocityContext)添加自定义资源加载器?

另一个问题:我想关闭所有内置装载机。特别WebappResourceLoader是默认情况下处于活动状态的它,在我的特定应用程序中会带来安全风险。怎么做?

展开
收起
垚tutu 2019-11-29 19:52:40 1040 0
1 条回答
写回答
取消 提交回答
  • #include

    我无法回答如何实现自己的资源加载器,但是第二部分非常简单:

    创建VelocityEngine时,可以传递定义资源加载器“类路径”的属性。

    不同的类加载器由属性键的前缀标识。所以像这样:

    Properties props = new Properties();
    
    // Add a default class path resource loader - just an example
    props.setProperty("cp.resource.loader.class", ClasspathResourceLoader.class.getName());
    props.setProperty("cp.resource.loader.cache", "true);
    
    // Add your own resource loader
    props.setProperty("db.resource.loader.class", MyDBResourceLoader.class.getName());
    props.setProperty("db.resource.loader.cache", "false");
    
    // Define the "class path" for the loaders
    // in this case first the "db" loader is asked for resources, if nothing is found the "cp" loader
    props.setProperty(RuntimeConstants.RESOURCE_LOADER, "db,cp");
    
    // Now create the engine
    VelocityEngine engine = new VelocityEngine(props);
    
    

    上面仅为该引擎定义了两个资源加载器,该引擎实例将不使用其他加载器。

    2019-11-29 19:52:57
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Apache Flink技术进阶 立即下载
Apache Spark: Cloud and On-Prem 立即下载
Hybrid Cloud and Apache Spark 立即下载

相关镜像