使用Singleton创建默认管理帐户

时间:2011-08-27 19:42:07

标签: java jsf java-ee ejb-3.0 java-ee-6

我从未使用过JavaEE 6的@Singleton新功能,我想尝试一下。

我正在考虑创建单身人士只需拥有一个密码,允许应用程序管理员(知道密码的人)访问该应用程序的某些内容。

我尝试在tutorial之后实现它,但它不起作用。 这就是我所做的:

我创建了单例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它不起作用。

- 我该如何解决?

- 我也有兴趣知道你为此目的使用单身人士的想法,你认为这是一个好的和安全的想法吗?

1 个答案:

答案 0 :(得分:2)

我想问题是,既然你在视图中的EL表达式中引用了你的单例,那么它必须用@Named注释。如果你只在其他人中使用你的bean,这不是必需的。

关于你的设计,我的2便士就是:

  • 由于您使用的是Java EE 6,因此无需为其指定接口。如果你想要/需要它,不要把它称为ISomething(除了你为Apple工作;-)但是给它一个域名相关的名字。
  • 使用允许并发读取访问的单例可以用于核心数据。只是,我不会将密码放在代码中,而是放入数据库表中,最好是散列并使用单例作为提供程序,以便在启动时读取表。
  • 一般来说,单身人士可能总是在应用程序中引入瓶颈,因为根据定义他们不会扩展。所以对于你的用例来说没关系,因为我们可以假设访问率非常低。如果我们有更改的数据,可能引入的另一个问题是竞争条件(也不适用于您的情况),因为我们只有一个实例被并行调用。
相关问题