2011-08-27 19 views
0

我從來沒有使用JavaEE 6的@Singleton新功能,我想試試看。使用Singleton創建默認管理帳戶

我正在考慮創建s Singleton來保存允許應用程序adiministrator(知道密碼的人)訪問應用程序的某些內容的密碼。

我試圖按照tutorial執行它,但它不起作用。 這是我做過什麼:

我創建了一個singleton bean:

@Singleton 
@Startup 
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public class AdminAcountEJB implements IAdminAcountEJB { 

    private String password; 

    @PostConstruct 
    public void init() { 
     password = "password"; 
    } 


    @Lock(LockType.READ) 
    public String getPassword() { 
     return password; 
    } 
} 

我提取的接口

public interface IAdminAcountEJB { 

    public abstract String getPassword(); 
} 

然後我嘗試使用@EJB

注入單在託管bean
@Named("managementBB") 
@SessionScoped 
public class ManagementBB implements Serializable{ 

    @EJB 
    private IAdminAcountEJB managementEJB;  
    private String input;  
    private boolean authorized; 

    public String seeWhatsUp() { 
     if(input.equals(managementEJB.getPassword())) { 
      authorized = true; 
      return "manage?faces-redirect=true;"; 
     } 
     return "index?faces-redirect=true;"; 
    } 

    //Get set methods... 

} 

我做的最後一件事就是創建一些顯示的標記情況輸入正確的密碼:

<h:form rendered="#{managementBB.authorized == false}"> 
      <h:inputSecret value="#{managementEJB.input}"/> 
      <h:commandButton value="..." action="#{managementEJB.seeWhatsUp}"/> 
     </h:form> 

<h:form rendered="#{managementBB.authorized}"> 
      CORRECT PASSWORD!! 
</h:form> 

這一切似乎確定我,但是當我訪問該頁面時,控制檯說:

javax.naming.NameNotFoundException: ejbinterfaces.IAdminAcountEJB#ejbinterfaces .IAdminAcountEJB找不到

我不明白爲什麼它不起作用,這是我如何注入其他EJB不是單例,但與@Singleton它不起作用。

- 我該如何解決?

- 我也很想知道你對於使用單片機達到這個目的有什麼看法,你認爲這是一個好的和安全的想法?

回答

2

我想問題是,既然你在視圖中的EL表達式中引用你的單例,它必須用@Named註釋。如果你只在別人中使用你的bean,這是沒有必要的。

關於你的設計,我的2個便士是這些:

  • 由於您使用的是Java EE 6,你不會需要指定的接口吧。如果你想/需要它,不要稱之爲ISomething(除了你爲蘋果工作;-),但給它一個域相關的名稱。
  • 對於核心數據,使用允許併發讀訪問的單例是可以的。只有,我不會將密碼放在代碼中,而是放入數據庫表中,最好是散列,並使用單例作爲提供程序,以便在啓動時讀取表。
  • 單身人士通常可能會在應用程序中引入瓶頸,因爲根據定義,它們不會縮放。所以對於你的用例來說沒關係,因爲我們可以假設訪問率非常低。如果我們有數據發生變化,可能會引入的另一個問題是競爭條件(也不是你的情況),因爲我們只有一個實例被並行調用。
+0

我不是從EL語法中引用singleton,請參閱'#{managementEJB.seeWhatsUp}「'是一個使用singletone的支持bean中的方法,但我不直接調用它。另外我對如何在單例中使用'@ Named'註解感到困惑,應該如何調用它?順便說一句,使用數據庫的想法,並在啓動時讀取它(聽起來很有趣) – sfrj

+0

對不起,我剛剛發現了錯誤,我在調用EJB而不是頁面中的支持bean。它讓我想起了一段時間:)謝謝 – sfrj