I am trying to write my first JSF2.0 project (using EJB3.1). I do not understand why my @ManagedBean annotation does not work.
I always get an error message when I run the application on Glassfish v3
exceptions
javax.servlet.ServletException: /login.xhtml @ 34,133 value = "# {loginBean.login}": Target unreachable, id 'loginBean' allowed null
The main reason
javax.el.PropertyNotFoundException: /login.xhtml @ 34,133 value = "# {loginBean.login}": Target not available, identifier 'loginBean' allowed null
If I define a managed bean in faces-config.xml, it will work. But I want to use annotation.
Maybe I'm using the wrong libraries in my poses?
Managed example (this will be the transfer object):
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 (where I can try to use it):
<!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 Class:
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!"));
I really don't understand why this is not working :( What am I doing wrong?
UPD: Stack Trace: http://pastebin.com/istJmMHr
Source code can be downloaded from my Google drive: https://docs.google.com/file/d/0B4Am7SXJwmtKNVc0LVhWVlEyMVk/view