in velocity,当你执行$ object.variable时,如果它无法找到getter函数 访问它或getter返回null。它只会在页面上显示$ object.variable
我知道有一个安静的参考,但我不想添加!签署数千个变量。
我已经尝试过InvalidReferenceEventHandler,NullValueHandler它们都没有被调用。
我徘徊是否有特定类型的Eventhandler。
非常感谢
答案 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值。