我開發一些應用程序,它由三層組成:分層架構中的CDI。如何使用CDI註釋注入服務對象?
- 數據庫訪問層(JPA + Hibernate作爲提供商)
- 業務邏輯層
- 表示層(JSF 2.0)
在我開始之前,我閱讀了David Geary和Cay S. Horstmann撰寫的Core JavaServer Faces(第3版)一書中的一些章節。在本書中,作者強烈建議使用@Named
註釋而不是@ManagedBean
。好吧,我想我可以試試。用戶登錄
我也瞭解了一些新的註解,即@Inject
-
然後我剛好實現一些基本的功能着手層建築我的應用程序。我認爲僅僅在接口上注入一層到另一層可能會很舒服。但我擔心我誤解了一些東西,所以我帶着我的問題來找你。
讓我介紹我的代碼的某些部分:
CredentialsBean.java:
@Named("userCredentials")
public class CredentialsBean {
@Inject
AccountService accountService;
private String login;
private String password;
public String verify()
{
if (accountService.verifyCredentials(login, password))
return "success";
else
return "failure";
}
// getters and setters
}
AccountService.java:
public interface AccountService {
public Boolean verifyCredentials(String login, String password);
}
AccountServiceImpl.java:
public class AccountServiceImpl implements AccountService {
@Inject
AccountDAO dao;
@Override
public Boolean verifyCredentials(String login, String password) {
// some logic
}
}
AccountDAO.java:
public interface AccountDAO {
public Account getAccount(String login);
}
AccountDAOImpl.java:
public class AccountDAOImpl implements AccountDAO {
@PersistenceContext(unitName = "MyApp")
protected EntityManager em;
public EntityManager getEntityManager() {
return em;
}
@Override
public Account getAccount(String login) {
// some data processing
}
}
這最後一堂課上的一些Java類操作與@Entity
註釋,請不要介意。
我有一種感覺,我的解決方案出了問題。
基本錯誤是事實,即使我提供一些數據與<h:form>
,<h:inputText>
標籤創建的形式,調試verify()
方法時,我所看到的,login
和password
是null
,那麼什麼是錯在這裏,但我有不知道是什麼。
我也擔心我是否理解@Inject
。我可以像上面提供的那樣使用它來使用接口來連接圖層嗎?
好的。我發現我在登錄和密碼字段中得到空值的原因,但我還不知道解決方案。 發生這種情況是因爲在以某種神奇方式執行期間,創建了多個(至少兩個)CredentialsBean實例。檢查Eclipse調試器。首先得到它的字段設置正確,但第二個沒有,並且這第二個值被髮送到服務層。 我想知道這是不是一個範圍問題。我不應該把@SessionScoped放在CredentialsBean中嗎?
您的實現類沒有'@ Named'註釋。這是故意的還是過分簡化了代碼片段? – BalusC
他們有嗎?我認爲只有用於在JSF頁面和應用程序邏輯之間傳輸信息的bean才需要它。我錯了嗎? – rivasket
'@Stateless'也可以,如果它應該是一個EJB。容器應該怎樣知道你有哪些實現需要注入? – BalusC