4

初めての JSF2.0 プロジェクト (EJB3.1 を使用) を作成してみます。@ManagedBean アノテーションが機能しない理由がわかりません。

Glassfish v3 でアプリケーションを実行すると、常にエラーが発生します

例外

javax.servlet.ServletException: /login.xhtml @34,133 value="#{loginBean.login}": ターゲットに到達できません。識別子 'loginBean' が null に解決されました

根本的な原因

javax.el.PropertyNotFoundException: /login.xhtml @34,133 value="#{loginBean.login}": ターゲットに到達できません。識別子 'loginBean' が null に解決されました

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 ドライブからダウンロードできます: https://docs.google.com/file/d/0B4Am7SXJwmtKNVc0LVhWVlEyMVk/view

4

2 に答える 2

0

@ManagedBean が WAR パッケージではなく EJB パッケージに配置されたために発生しました。

すべての @ManagedBeans を WAR モジュールに移動すると、すべて獲得できました!

于 2013-03-13T09:12:18.593 に答える
0

物事を把握するには、非常に小さな例から始める方がよいと思います。あなたのコードには、正しくないものがたくさんあります。

まず、@Stateless Bean をビュー スコープにすることはできません。ちょっと考えてみてください。ステートレス ビュー スコープ Bean を持つとは、実際にはどういう意味ですか? そもそもなぜ必要だと思ったのですか?

ビューには 1 つのバッキング Bean が必要であり、これは多くの場合ビュー スコープです。そのビューに必要な DTO は、ビュー スコープにするべきではなく、メインのバッキング Bean のインスタンス変数にする必要があります。そうすれば、それらは自動的にそのスコープに依存します。

あなたの場合、 loginBean をユーザー変数と同じようにインスタンス変数にします。

于 2013-03-12T19:08:44.703 に答える