java Apache Velocity:验证上下文中的所有变量是否存在于velocity模板中

dzhpxtsq  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(110)

在Apache Velocity 1.7中是否可以检查VelocityContext中指定的所有键是否对模板有效?例如,假设我有一个模板card.vm,它看起来像这样:

card {
    type: CREDIT
    company: VISA
    name: "${firstName} ${lastName}"
}

如果我执行下面的代码,它应该抛出一个错误,因为cardNumber不存在于card.vm模板中:

VelocityContext context = new VelocityContext();
context.put("firstName", "tuk");
context.put("lastName", "man");
context.put("cardNumber", "1234");
StringWriter writer = new StringWriter();
t.merge(context, writer);
nimxete2

nimxete21#

正如Christopher在针对您前面的问题时在Velocity邮件列表中提到的那样,您总是可以创建VelocityContext的子类来定制这样的行为。
例如,这将跟踪哪些键被放入上下文中,并跟踪上下文中使用了哪些键。然后在合并模板之后调用context.checkForUnreferencedValues()。
您可能需要根据向上下文添加键的帮助器对象以及您是否重用它来定制代码。

static class ReferenceCountingVelocityContext extends VelocityContext {
        private Set<String> keysToCheck = new HashSet<>();
        private Set<String> keysUsed = new HashSet<>();

        @Override
        public Object put(String key, Object value) {
            keysToCheck.add(key);
            return super.put(key, value);
        }

        @Override
        public Object get(String key) {
            keysUsed.add(key);
            return super.get(key);
        }
        public void checkForUnreferencedValues() throws UnusedVelocityContextKeyException {
            if (!keysToCheck.containsAll(keysUsed)) {
                throw new UnusedVelocityContextKeyException();
            }
        }
    }

相关问题