2

我已经编写了非常基本的 Velocity 模板,它使用#foreach指令。当我运行它时,我在日志中收到以下消息:

[警告]directive.foreach.iterator.name 属性已被弃用。它将在 Velocity 2.0 中被删除(连同 $velocityHasNext 本身)。相反,请使用 $foreach.hasNext 从现在开始访问此值。

但问题是我不使用这个属性,至少是明确的。我只是#foreach以基本形式使用循环,正如用户指南中所示。

下面是产生此日志警告的简单代码。速度版本是 1.7。

final Properties properties = new Properties();
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.init(properties);

StringWriter stringWriter = new StringWriter();
Map<String, Object> velocityVars = new HashMap<>();
List<Date> dates = new ArrayList<>(); 
dates.add(new Date()); 
dates.add(new Date());
velocityVars.put("dates", dates);
VelocityContext velocityContext = new VelocityContext(velocityVars);

String template =
                "foo\n" +
                "#foreach($d in $dates)\n" +
                "  $d\n" +
                "#end \n" +
                "bar";

velocityEngine.evaluate(velocityContext, stringWriter, "blah", template);
System.out.println(stringWriter.toString());

所以问题是 - 为什么会记录此警告以及如何构建我的代码以防止它出现?

4

1 回答 1

2

directive.foreach.iterator.name不是在代码中找到的东西,而是在velocity.properties文件中。并且出于向后兼容性的原因,这个已弃用的定义仍然存在于默认配置中。

该警告在指令本身的初始化期间显示foreach,因此它不是由您正在执行的操作触发的。您可以放心地忽略此警告,但如果您绝对不想再看到它,您可以:

  1. 提高上面的日志记录级别WARN
  2. 编写您自己的自定义属性文件,或者只是从 Java 中添加您正在创建的对象,为和Properties的空值。directive.foreach.counter.namedirective.foreach.iterator.namedirective.foreach.counter.initial.value
  3. 或者,org/apache/velocity/runtime/defaults/velocity.properties从类路径目录中的 velocity jar 中提取,并从中删除不推荐使用的设置。
于 2012-12-22T04:38:55.397 回答