速度,当您执行$ object.variable时,如果无法找到获取者函数 访问它或者getter返回null。它只会显示$ object.variable页面速度事件处理程序
我知道有一个安静的参考,但我不想补充!签署数千个变量。
我试过InvalidReferenceEventHandler,NullValueHandler它们都没有被调用。
我漫步是否有一个特定类型的事件处理程序为此。
非常感谢
速度,当您执行$ object.variable时,如果无法找到获取者函数 访问它或者getter返回null。它只会显示$ object.variable页面速度事件处理程序
我知道有一个安静的参考,但我不想补充!签署数千个变量。
我试过InvalidReferenceEventHandler,NullValueHandler它们都没有被调用。
我漫步是否有一个特定类型的事件处理程序为此。
非常感谢
我基于此引擎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创建更有趣的规则或模式,而不仅仅是返回第一个非空值。
以上似乎也是一个有效的选择。不过这里是另一种选择:
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
你可能会在结果,虽然感到惊讶,所以它可能会需要根据您的需求进行微调。
斯科特仍然没有工作,我仍然试图找到答案,会让你更新。 –
Whaat行为是否与上面的代码一致?我在我们的应用程序中对它进行了测试,确实在呈现的页面上没有显示无效的引用。你确定你的房产被拿走了吗?添加任何日志记录到示例? – Scott
在我的大多数情况下,getter本身是有效的,但是getter返回的值可能为null,这是困难的一点,因为该方法是有效的,无效的stethos永远不会被调用 –
基本上遍历相同的代码如果引用为null(当getter不存在时,执行调用返回null - 除非您已打开严格引用)。 – Scott
如何打开严格的参考?你的意思是不使用安静的参考?但还是非常感谢你的时间和善良。 –