JavaEE7:使用事件登录

JavaEE7:使用事件登录,java,jsf,Java,Jsf,在我的应用程序中,用户可以作为用户或管理员登录 是否可以在JavaEE7中使用事件来实现这一点 现在,我的代码如下所示: a) JSF视图的ManagedBean public String validateUsernamePassword() { Admin admin = new Admin(); admin.setPassword(pwd); admin.setUserName(userName); adminLoginEve

在我的应用程序中,用户可以作为用户或管理员登录

是否可以在JavaEE7中使用事件来实现这一点

现在,我的代码如下所示: a) JSF视图的ManagedBean

public String validateUsernamePassword() {
        Admin admin = new Admin();
        admin.setPassword(pwd);
        admin.setUserName(userName);
        adminLoginEvent.fire(admin);
        return Pages.CONSOLE;

    }
b) 侦听事件的服务:

public void onAdminLogin(@Observes final Admin admin) {

        List<Admin> foundAdmin = adminLoginDao.login(admin);

        if (foundAdmin != null) {                 
            HttpSession session = sessionController.getSession();
            session.setAttribute("username", foundAdmin.get(0).getUserName());
            consoleController.setAdmin(foundAdmin.get(0));
        }
    }
onAdminLogin上的公共无效(@final Admin){
List foundAdmin=adminLoginDao.login(admin);
如果(foundAdmin!=null){
HttpSession session=sessionController.getSession();
setAttribute(“用户名”,foundAdmin.get(0.getUserName());
consoleController.setAdmin(foundAdmin.get(0));
}
}
当然,问题是,在托管bean中,我无法判断登录是否成功。我可以在
onAdminLogin
方法中触发另一个事件,但是我应该在哪里监听它呢


我是否必须让
onAdminLogin
返回一个布尔值,然后在
validateUsernamePassword
方法中使用该布尔值?

关于为什么需要触发服务必须侦听的CDI事件,目前还不清楚。这是一个很大的设计缺陷,如果这真的是一个从Servlet API公开
HttpSession
的真正服务的话。我猜这个sessionController.getSession()通过JSF FacesContext类获得对会话的引用?@Tiny:这个服务类只是我的托管bean和DAO之间的另一层。这不是通常的架构吗?@Gimby:是的,就是这样。我没有得到“问题当然是,在托管bean中,我无法判断登录是否成功”的声明。然后-是的,你可以;会话在成功登录后设置了一个属性“username”。您可以使用适当的bean(而不仅仅是字符串)将其转化为一个稍微干净的解决方案,但是您可以知道,没有什么是清楚的,为什么您需要触发一个必须由服务监听的CDI事件。这是一个很大的设计缺陷,如果这真的是一个从Servlet API公开
HttpSession
的真正服务的话。我猜这个sessionController.getSession()通过JSF FacesContext类获得对会话的引用?@Tiny:这个服务类只是我的托管bean和DAO之间的另一层。这不是通常的架构吗?@Gimby:是的,就是这样。我没有得到“问题当然是,在托管bean中,我无法判断登录是否成功”的声明。然后-是的,你可以;会话在成功登录后设置了一个属性“username”。您可以使用适当的bean而不仅仅是字符串将其转换为稍微干净的解决方案,但是您可以知道。