作者lueichun (= =)
看板java
標題[問題] 使用CDI注入物件到屬性
時間Sat Jan 2 23:04:45 2021
※狀況概述:
我嘗試用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://webptt.com/m.aspx?n=bbs/java/M.1609599887.A.06E.html
※ 編輯: lueichun (1.160.35.165 臺灣), 01/03/2021 22:04:27