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

jopen 10年前發布 | 6K 次閱讀 Weld

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));
}
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!