在velocity中,如果无法找到访问它的getter函数或getter返回null,则执行$object.variable。它只会在页面上显式地显示$object.variable
我知道有一个安静的参考,但我不想增加!对数以千计的变量签名。
我试过InvalidReferenceEventHandler,NullValueHandler,它们都没有被调用。
我想知道有没有一种特定类型的Eventhandler来处理这个问题。
非常感谢
发布于 2011-10-05 22:23:39
以上似乎也是一个有效的选择。然而,这里有另一个选择:
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您可能会对结果感到惊讶,因此可能需要根据您的需求进行微调。
发布于 2011-10-04 23:38:25
我是基于Engine-1.7代码的。
似乎当调用一个无效的方法时,实用程序方法EventHandlerUtil.invalidGetMethod也会被调用。此方法创建一个新的InvalidGetMethodExecutor (这是InvalidReferenceEventHandler上的一个内部类)。最终,它会向下链接到对invalidReferenceHandlerCall的调用,该调用最终会遍历任何已定义的handlerIterators。不幸的是,我对Velocity的内部知识了解不够,无法告诉您如何注入这些值。我的猜测是,用户列表将建议一种覆盖此行为的方法,或者建议使用/实现自定义工具。
编辑:
根据开发人员指南,您可以执行以下操作。您需要编写一些代码来处理它,但这应该不会太难:
可插拔的自省
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创建更多有趣的规则或模式,而不仅仅是返回第一个非空值。
https://stackoverflow.com/questions/7649289
复制相似问题