【问题标题】:Using a Singleton to create a default administrative account使用 Singleton 创建默认管理帐户
【发布时间】:2011-08-27 19:42:06
【问题描述】:

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

我正在考虑创建 s 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 未找到

我不明白为什么它不起作用,这就是我注入其他不是 Singletones 但使用 @Singleton 它不起作用的 EJB 的方式。

-我该如何解决?

-我也很想知道您对为此目的使用单音有何看法,您认为这是一个好且安全的想法吗?

【问题讨论】:

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


    【解决方案1】:

    我想问题是,由于您在视图中的 EL 表达式中引用您的单例,因此必须使用 @Named 进行注释。如果您只在其他人中使用您的 bean,则没有必要。

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

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

    【讨论】:

    • 我不是指 EL 语法中的单例,请参阅 "#{managementEJB.seeWhatsUp}" 是使用单例的支持 bean 中的方法,但我没有直接调用它。我也对如何在单例中使用@Named 注释感到困惑,我应该怎么称呼它?顺便说一下使用数据库并在启动时读取它的想法+1(听起来很有趣)
    • 抱歉,我刚刚发现了错误,我调用的是 EJB 而不是页面中的支持 bean。我花了一段时间才注意到 :) 谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 2022-08-18
    • 2019-12-19
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多