Weld 在 JDK 8u60 環境下的一個問題
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 中這些額外的參數是注入點。
例子
class Foo {
void observe(@Observes @Juicy String payload) {
Arrays.asList("foo").stream().filter((s) -> s.equals(payload));
}
} 為 lambda 表達式創建一個虛方法,并且事件參數作為方法參數被使用。注解被保護著。在這個例子中 Weld 創建了兩個有著相同事件參數:@Observes @Juicy String payload 的觀測者方法。
解決方法
使用一個額外的本地變量代替事件參數,將事件參數的值賦給本地變量:
public void observe(@Observes @Juicy String payload) {
String p = payload;
Arrays.asList("foo").stream().filter((s) -> s.equals(p));
}本文地址:http://www.oschina.net/translate/jdk-8u60-problem
原文地址:http://weld.cdi-spec.org/news/2015/09/15/jdk-8u60-problem/