Jsf2. 0 аннотация @ManagedBean не работает [дубликат]
На этот вопрос уже есть ответ здесь:
Я пытаюсь написать свой первый проект JSF2. 0 (с использованием EJB3. 1). Я не понимаю, почему моя @ ManagedBean аннотация не работает.
Я всегда получаю ошибку, когда запускаю приложение на Glassfish v3
Исключение
Явакс.сервлет.ServletException: / login.в XHTML @34,133 value= " #{loginBean.login}": цель недостижима, идентификатор 'loginBean' разрешается в null
Первопричина
Явакс.эль.PropertyNotFoundException: / login.в XHTML @34,133 value= " #{loginBean.login}": цель недостижима, идентификатор 'loginBean' разрешается в null
Если я определяю управляемый боб в faces-config.xml-это будет работать. Но я хочу использовать аннотацию.
Может быть, я использую неправильные библиотеки в своих 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;
}
}
Вход.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>
Класс UserController:
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
2 ответа:
Я думаю, что вам лучше начать с очень маленького примера, чтобы понять суть вещей. В вашем коде есть много не совсем правильных вещей.
Для начала боб @без состояния не может быть виден в области видимости. Подумайте об этом на мгновение. Что бы это на самом деле значило иметь безгосударственный вид с областью Боба? С чего ты вообще взял, что он тебе нужен?
Представление должно иметь один резервный Боб, и этот Боб часто является областью видимости. Любые DTOs, которые могут понадобиться для этого представления, не должны быть представлением область действия, но должны быть просто переменными экземпляра главного бэк-Бина. Таким образом, они будут автоматически зависеть от этой области.
В вашем случае сделайте loginBean переменной экземпляра точно так же, как пользовательскую переменную.