2011-10-04 113 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