我从未使用过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它不起作用。
- 我该如何解决?
- 我也有兴趣知道你为此目的使用单身人士的想法,你认为这是一个好的和安全的想法吗?
答案 0 :(得分:2)
我想问题是,既然你在视图中的EL表达式中引用了你的单例,那么它必须用@Named
注释。如果你只在其他人中使用你的bean,这不是必需的。
关于你的设计,我的2便士就是: