速度,當您執行$ 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
如何打開嚴格的參考?你的意思是不使用安靜的參考?但還是非常感謝你的時間和善良。 –