【问题标题】:JSF2.0 annotation @ManagedBean not work [duplicate]JSF2.0注释@ManagedBean不起作用[重复]
【发布时间】:2013-02-28 04:41:50
【问题描述】:

我尝试编写我的第一个 JSF2.0 项目(使用 EJB3.1)。我不明白为什么我的 @ManagedBean 注释不起作用。

在 Glassfish v3 上运行应用程序时总是出错

异常

javax.servlet.ServletException: /login.xhtml @34,133 value="#{loginBean.login}":目标不可达,标识符'loginBean' 解决为空

根本原因

javax.el.PropertyNotFoundException: /login.xhtml @34,133 value="#{loginBean.login}":目标不可达,标识符'loginBean' 解决为空

如果我在 faces-config.xml 中定义一个托管 bean - 它会起作用。但我想使用注释。

我可能在我的 poms 中使用了错误的库吗?

managedbean 示例(它将是一个传输对象):

package edu.tsystems.vmmail.web.core.domain;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import java.io.Serializable;

@ManagedBean
@ViewScoped
public class LoginBean implements Serializable {
    private String login;
    private String password;

    public LoginBean() {}

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

login.xhtml(我可以尝试使用它):

<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html   xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:p="http://primefaces.org/ui">
    <f:loadBundle var="common" basename="edu.tsystems.vmmail.web.ui.MessageResources" />
    <h:head>
        <title>Welcome to VMMail Web Interface</title>
        <link type="text/css" href="#{request.contextPath}/css/style.css" rel="stylesheet" />
    </h:head>
    <h:body>
        <f:view>
            <h:form id="loginForm" method="post">
                <p:panelGrid id="mainLogin" styleClass="noInnerBorderTable">
                    <f:facet name="header">
                        <p:row>
                            <p:column colspan="4">
                                <h:outputText value="#{common['login.welcome']}" /><br/>
                                <h:message for="loginBean" id="login1Error" />
                            </p:column>
                        </p:row>
                    </f:facet>
                    <p:row>
                        <p:column rowspan="2">
                            <div class="logoCell"></div>
                        </p:column>
                        <p:column>
                            <h:outputText value="#{common['field.login']}" for="loginBean" />
                        </p:column>
                        <p:column>
                            <p:inputText id="loginBean" required="true" value="#{loginBean.login}" requiredMessage="#{common['field.login.required']}" />
                        </p:column>
                        <p:column rowspan="2">
                            <div class="submitButtonCell">
                                <p:commandLink styleClass="loginAnchor" title="#{common['field.loginButton']}"
                                        action="#{userController.loggingIn(login)}" ajax="false" />
                            </div>
                        </p:column>
                    </p:row>
                    <p:row>
                        <p:column>
                            <h:outputText for="password" value="#{common['field.password']}" />
                        </p:column>
                        <p:column>
                            <p:password id="password" required="true" value="#{loginBean.password}" requiredMessage="#{common['field.password.required']}" />
                        </p:column>
                    </p:row>

                    <f:facet name="footer">
                        <p:row>
                            <p:column colspan="4">
                                <h:outputText value="#{common['login.notHave']}" />
                                <a href="#{request.contextPath}/registration.xhtml">
                                    <h:outputText value="#{common['login.registerNow']}" />
                                </a>
                            </p:column>
                        </p:row>
                    </f:facet>
                </p:panelGrid>
            </h:form>
        </f:view>
    </h:body>
</html>

用户控制器类:

package edu.tsystems.vmmail.web.core.controllers;

import edu.tsystems.vmmail.web.core.dao.UserDAO;
import edu.tsystems.vmmail.web.core.domain.LoginBean;
import edu.tsystems.vmmail.web.core.model.UserEntity;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

@Stateless
@ViewScoped
public class UserController {
    @EJB
    private UserDAO userDAO;
    private UserEntity user;

    public boolean isLoggedIn() {
        return user != null;
    }

    public String loggingIn(LoginBean loginBean) {
        FacesContext context = FacesContext.getCurrentInstance();

        if(userDAO == null) {
            context.addMessage("loginForm:login1Error", new FacesMessage("DAO IS NULL!"));
//          return "/loginBean.xhtml?faces-redirect=true&error=1";
        }

        user = userDAO.getUserByLoginAndPassword(loginBean.getLogin(), loginBean.getPassword());
        if (user != null) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);

            session.setAttribute("user", user.getId());
            return "/mail/mail.xhtml?faces-redirect=true";
        } else {
            return "/loginBean.xhtml?faces-redirect=true";
        }
    }

    public String logout() {
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        return "/login.xhmtl?faces-redirect=true";
    }
}

我真的不明白为什么它不起作用:(我做错了什么?

UPD:堆栈跟踪:http://pastebin.com/istJmMHr

源代码可以从我的google drive下载:https://docs.google.com/file/d/0B4Am7SXJwmtKNVc0LVhWVlEyMVk/view

【问题讨论】:

  • 你能用程序员的方式定义“不工作”,而不是像用户吗?
  • 哦,对不起,我忘了描述一个错误:(更新帖子。
  • @beowulf13th 你可以删除控制器并重新创建它吗?你得到同样的错误吗?我也怀疑容器问题你可以试试tomcat吗?
  • @berkay 我无法将它部署到 tomcat,因为我制作了一个 EAR 包。我创建了带有注释@javax.ejb.Stateless 和@javax.faces.bean.ViewScoped 的UserTwoController 和带有注释@javax.faces.bean.ManagedBean 和@javax.faces.bean.ViewScoped 的LoginBeanTwo。但它没有任何作用。
  • @beowulf13th 在此处发布您的完整堆栈跟踪。 loginBean 没有被实例化可能有一个潜在的原因。看起来您正在尝试将 EJB 和托管 bean 组合在一起。不要这样做。

标签: jsf jakarta-ee jsf-2 ejb managed-bean


【解决方案1】:

我认为你最好从一个非常小的例子开始来掌握事情。您的代码中有很多地方不太对劲。

首先,@Stateless bean 不能在视图范围内。对此稍加思考。拥有无状态视图范围 bean 究竟意味着什么?为什么你认为你首先需要一个?

一个视图应该有一个支持 bean,而这个通常是视图范围的。该视图可能需要的任何 DTO 都不应该是视图范围的,而应该只是主支持 bean 的实例变量。这样,它们将自动依赖于该范围。

在你的情况下,让 loginBean 成为一个实例变量,就像用户变量一样。

【讨论】:

  • 完全错误的说法。 @Stateless 可以查看范围。醒来。
  • @Makky 我现在真的很好奇。为什么你认为无状态 bean 可以是视图范围的,“无状态视图范围 bean”在语义上是什么意思?如果用户导航离开视图,容器如何销毁无状态 bean?容器如何确保对这个视图范围的无状态 bean 的所有请求都转到同一个 bean 实例?请教育我!在此先感谢:)
  • 我的意思是说无状态 EJB 可以在 Viewscoped Managed Bean 中使用。为什么不
  • @Makky 当然,视图范围的 bean 可以使用无状态 bean。这实际上是最常见的用例之一。为什么这不可能?谁说这是不可能的?
【解决方案2】:

这是因为我的 @ManagedBean 被放置在 EJB 包中,而不是在 WAR 包中。

当我将所有 @ManagedBeans 移到我的 WAR 模块中时,全部赚到了!

【讨论】:

    猜你喜欢
    • 2018-05-14
    • 1970-01-01
    • 2013-10-22
    • 2017-10-23
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多