2011-10-04 70 views
3

速度,当您执行$ object.variable时,如果无法找到获取者函数 访问它或者getter返回null。它只会显示$ object.variable页面速度事件处理程序

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

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

我漫步是否有一个特定类型的事件处理程序为此。

非常感谢

回答

2

我基于此引擎1.7代码。

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

编辑:

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

可插拔自省

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

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

+1

在我的大多数情况下,getter本身是有效的,但是getter返回的值可能为null,这是困难的一点,因为该方法是有效的,无效的stethos永远不会被调用 –

+0

基本上遍历相同的代码如果引用为null(当getter不存在时,执行调用返回null - 除非您已打开严格引用)。 – Scott

+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 

你可能会在结果,虽然感到惊讶,所以它可能会需要根据您的需求进行微调。

+0

斯科特仍然没有工作,我仍然试图找到答案,会让你更新。 –

+0

Whaat行为是否与上面的代码一致?我在我们的应用程序中对它进行了测试,确实在呈现的页面上没有显示无效的引用。你确定你的房产被拿走了吗?添加任何日志记录到示例? – Scott