首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Velocity Eventhandler

Velocity Eventhandler
EN

Stack Overflow用户
提问于 2011-10-04 22:15:05
回答 2查看 1.2K关注 0票数 3

在velocity中,如果无法找到访问它的getter函数或getter返回null,则执行$object.variable。它只会在页面上显式地显示$object.variable

我知道有一个安静的参考,但我不想增加!对数以千计的变量签名。

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

我想知道有没有一种特定类型的Eventhandler来处理这个问题。

非常感谢

EN

回答 2

Stack Overflow用户

发布于 2011-10-05 22:23:39

以上似乎也是一个有效的选择。然而,这里有另一个选择:

代码语言:javascript
复制
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文件中添加以下内容:

代码语言:javascript
复制
eventhandler.invalidreferences.class=path.to.package.AppSpecificInvalidReferenceEventHandler,org.apache.velocity.app.event.implement.ReportInvalidReferences

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

票数 3
EN

Stack Overflow用户

发布于 2011-10-04 23:38:25

我是基于Engine-1.7代码的。

似乎当调用一个无效的方法时,实用程序方法EventHandlerUtil.invalidGetMethod也会被调用。此方法创建一个新的InvalidGetMethodExecutor (这是InvalidReferenceEventHandler上的一个内部类)。最终,它会向下链接到对invalidReferenceHandlerCall的调用,该调用最终会遍历任何已定义的handlerIterators。不幸的是,我对Velocity的内部知识了解不够,无法告诉您如何注入这些值。我的猜测是,用户列表将建议一种覆盖此行为的方法,或者建议使用/实现自定义工具。

编辑:

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

可插拔的自省

代码语言:javascript
复制
runtime.introspector.uberspect = org.apache.velocity.util.introspection.UberspectImpl

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7649289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档