天天看點

Weld 在 JDK 8u60 環境下的一個問題

最近釋出的 jdk 8u60 在不是所有的虛拟成員都被正确地忽略掉得的 weld 裡暴露出來了一個問題。這個問題已經在 2.2.16.final,2.3.0.cr2 和 3.0.0.alpha14(還未釋出)中解決了。然而,如果你沒有使用 lambda 表達式引用一個事件或處理的參數裡面的一個觀察者或處理器方法,你的應用就不會受到任何影響。相關問題請檢視 weld-2019。

如果有一個 lambda 表達式引用一個事件或處理的參數裡面的一個觀察者或處理器方法。編譯器就會使用事件參數作為一個參數建立一個虛方法。從 8u60 開始,參數注解也被保留下來作為虛方法,是以 weld 錯誤的将這些虛方法作為觀察者或處理器的方法。

也許你已經了解了 weld-000409:對于容器的生命周期事件,觀察者方法隻能.... 如果在擴充甚至是 weld-001408:對于類型的不滿足依賴...中使用這樣的 lambda 表達式,如果在正常的觀測者中使用 lambda 表達式并且 lambda 表達式使用了較多的引用(例如,不僅僅是事件或處理參數,也有些是虛方法的方法參數),在 cdi 中這些額外的參數是注入點。

為 lambda 表達式建立一個虛方法,并且事件參數作為方法參數被使用。注解被保護着。在這個例子中 weld 建立了兩個有着相同僚件參數:@observes @juicy string payload 的觀測者方法。

使用一個額外的本地變量代替事件參數,将事件參數的值賦給本地變量: