2013-03-18 19 views
1

在我們的應用程序之一,我們有兩類用戶,ManagedBean繼承與通用名稱

  1. 內部用戶(class InternalUser extends User
  2. 外部用戶(class ExternalUser extends User

我們正在利用這些作爲會話範圍的託管bean(基本上是爲了注入登錄用戶的細節,在class User中有一些共同的細節,以及上面所述的兩個類中的每一箇中的一些具體細節)。

我可以爲兩個託管的bean命名(這裏是「loggedInUser」)嗎?

面臨的是拋出一個異常「託管bean名爲‘與loggedInUser’已經被註冊。更換現有的管理bean類...

我們如何管理這種情況?

回答

2

一種方法就是不讓它成爲JSF託管bean。使與登錄表單關聯的bean成爲請求/視圖範圍,並將User實例放入您自己的會話範圍中。

E.g.

User user = service.find(username, password); 

if (user != null) { 
    externalContext.getSessionMap().put("user", user); 
} 

這將是可作爲EL範圍#{user}(並因此也可注射的經由其他豆類@ManagedProperty上正是表達)。在find()方法中,您可以相應地返回InternalUserExternalUser

+0

只是爲了我自己的知識......爲什麼要這樣做,而不是像我剛纔所說的那樣將業務/可持久對象與JSF bean分開?看起來糟糕的設計開始時認爲Internal/ExternalUser應該是一個託管bean。 – 2013-03-19 20:09:16

1

也許是一個名爲CurrentUser的託管bean,其中一個爲Internal/ExternalUser作爲成員?在我自己的應用程序中,我不確定是否會按照您嘗試執行的方式將User子類作爲業務對象和託管bean進行加倍,從而注入所需的數據。