Velocity Eventhandler

时间:2011-10-04 14:15:05

标签: velocity

in velocity,当你执行$ object.variable时,如果它无法找到getter函数  访问它或getter返回null。它只会在页面上显示$ object.variable

我知道有一个安静的参考,但我不想添加!签署数千个变量。

我已经尝试过InvalidReferenceEventHandler,NullValueHandler它们都没有被调用。

我徘徊是否有特定类型的Eventhandler。

非常感谢

2 个答案:

答案 0 :(得分:3)

以上似乎也是一个有效的选择。不过这是另一种选择:

public class AppSpecificInvalidReferenceEventHandler implements 
                                                     InvalidReferenceEventHandler
{

  private static final Logger LOGGER = 
     Logger.getLogger(AppSpecificInvalidReferenceEventHandler.class);

  @Override
  public Object invalidGetMethod(Context context, String reference, 
                                 Object object, String property, Info info)
  {
    reportInvalidReference(reference, info);
    return "";
  }

  @Override
  public boolean invalidSetMethod(Context context, String leftreference, 
                                  String rightreference, Info info)
  {
    reportInvalidReference(leftreference, info);
    return false;
  }

  @Override
  public Object invalidMethod(Context context, String reference, Object object, 
                              String method, Info info)
  {
    if (reference == null) {
      reportInvalidReference(object.getClass().getName() + "." + method, info);
    } else {
      reportInvalidReference(reference, info);
    }
    return "";
  }

  private void reportInvalidReference(String reference, Info info)
  {
    LOGGER.info("REFRERENCE: " + reference + " Info <" + info + ">");
  }
}

您还需要将以下内容添加到velocity.properties文件中:

eventhandler.invalidreferences.class=path.to.package.AppSpecificInvalidReferenceEventHandler,org.apache.velocity.app.event.implement.ReportInvalidReferences

您可能会对结果感到惊讶,因此可能需要根据您的需要进行微调。

答案 1 :(得分:2)

我的基础是Engine-1.7代码。

当调用无效方法时,似乎调用了实用程序方法EventHandlerUtil.invalidGetMethod。此方法创建一个新的InvalidGetMethodExecutor(这是InvalidReferenceEventHandler上的内部类)。最终,这会链接到对invalidReferenceHandlerCall的调用,该调用最终会迭代已定义的任何handlerIterators。不幸的是,我对Velocity的内部结构知之甚少,并告诉你如何注入这些值。我的猜测是用户列表会建议一种覆盖此行为的方法,或者建议使用/实现自定义工具。

编辑:

根据开发人员指南,您可以执行以下操作。你需要编写一些代码来处理它,但它不应该太难:

可插入的自省

runtime.introspector.uberspect = org.apache.velocity.util.introspection.UberspectImpl

此属性设置'Uberspector',即内省包,用于处理Velocity的所有内省策略。您可以指定以逗号分隔的Uberspector类列表,在这种情况下,所有Uberspectors都是链接的。默认的链接行为是在所有提供的uberspectors中为每个内省调用返回第一个非null值。您可以通过继承org.apache.velocity.util.introspection.AbstractChainableUberspector(或直接实现org.apache.velocity.util.introspection.ChainableUberspector)来修改此行为(例如,限制对某些方法的访问)。这允许您为Uberspection创建更有趣的规则或模式,而不是仅返回第一个非null值。