看板 java 關於我們 聯絡資訊
※狀況概述: 我嘗試用CDI,將DAO物件注入到位於某個Action的DAO屬性裡,不過都失敗,看起來是 注入沒有成功。 ※程式碼: DAO: @Named @ApplicationScoped public class TestDao { ...... } Action: @ManagedBean(name="testAction") @SessionScoped public class TestAction { @Inject TestDao testDao; public List<Customer> query(){ customerList = testDao.query();//執行到這行出錯 } ※錯誤訊息: com.sun.faces.lifecycle.InvokeApplicationPhase execute 警告: #{testAction.query()}: java.lang.NullPointerException javax.faces.FacesException: #{testAction.query()}: java.lang.NullPointerException threw exception [java.lang.NullPointerException] with root cause java.lang.NullPointerException ※補充說明: 看起來是注入沒有成功才會跳NullPointerException, DAO有用@Named跟@ApplicationScoped來註冊物件跟指定存在的scope action也有用@inject宣告要注入的屬性 那請問要如何修改才能修正呢? -------------------------------- 結果我放棄CDI的寫法,改用純JSF的寫法: @ManagedBean(name="testDao") @SessionScoped //改寫成這樣 public class TestDao { List<Customer> customerList; public List<Customer> query(){ ...... } } @ManagedBean(name="testAction") @SessionScoped public class TestAction { List<Customer> customerList; @ManagedProperty(value="#{testDao}") //改寫成這樣 TestDao testDao; public List<Customer> query(){ customerList = testDao.query(); } //新增以下部分: public TestDao getTestDao() { return testDao; } public void setTestDao(TestDao testDao) { this.testDao = testDao; } } 暫時改成JSF的寫法就可以動,不過還是不懂為何用CDI就不行。 將Server由Tomcat改成wildfly後,原本CDI的語法即可運作, 看來是Tomcat不支援CDI的關係。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.169.110.42 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/java/M.1609599887.A.06E.html ※ 編輯: lueichun (1.160.35.165 臺灣), 01/03/2021 22:04:27