2011-08-27 54 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