2013-03-12 1 views
4

Я пробую написать свой первый проект JSF2.0 (с использованием EJB3.1). Я не понимаю, почему моя аннотация @ManagedBean не работает.JSF2.0 аннотация @ManagedBean не работает

Я всегда получаю сообщение об ошибке, когда я запускаю приложение на GlassFish v3

исключение

javax.servlet.ServletException: /login.xhtml @ 34,133 значение = "# {} loginBean.login «: Target недостижим, идентификатор 'loginBean' решил обнулить

первопричины

javax.el.PropertyNotFoundException: /login.xh TML @ 34,133 значения = "# {} loginBean.login": Target недостижимого, идентификатор 'loginBean' решил обнулить

Если я определяю управляемый компонент в лицах-config.xml - он будет работать. Но я хочу использовать аннотацию.

Может быть, я использую неправильные библиотеки в своих позах?

Пример 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> 

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: Stack след: http://pastebin.com/istJmMHr

Исходный код можно загрузить с моего диска Google: https://docs.google.com/file/d/0B4Am7SXJwmtKNVc0LVhWVlEyMVk/view

+0

Можете ли вы определить, что «не работает» более программистом, а не как пользователь? – partlov

+0

oh, sry, я забыл описать ошибку :(обновленный пост. – beowulf13th

+0

@ beowulf13th вы можете просто удалить контроллер и создать его снова? Вы получаете ту же ошибку? Я также сомневаюсь, что проблема с контейнером вы можете попробовать tomcat? – berkay

ответ

0

Это произошло потому, что мой @ManagedBean был помещен в пакет EJB, а не в пакете WAR.

Когда я перевел все @ManagedBeans в мой WAR-модуль, все заработали!

0

Я думаю, что вы можете лучше начать с очень небольшой пример, чтобы получить понимание вещей. В коде есть много не совсем правильного.

Чтобы начать, объект @Stateless не может быть просмотрен. Подумайте об этом на мгновение. Что бы на самом деле означало, что объект с включенным статусом не имеет статуса? Почему, по-вашему, вам нужно было в первую очередь?

В представлении должен быть один бэк-компонент, и этот вид часто просматривается в области. Любые DTO, которые вам могут понадобиться для этого представления, не должны быть просмотрены, но должны быть просто переменными экземпляра основного бэкэнда. Таким образом, они будут автоматически зависеть от этой области.

В вашем случае сделайте loginBean переменной экземпляра так же, как и пользовательскую переменную.

+0

Полностью неправильная инструкция. @Stateless можно просмотреть в области. Вставай. – Makky

+0

@Makky Мне сейчас очень интересно. Почему, по вашему мнению, можно просмотреть объект без статусов, и что означает «семантичный вид с учетом состояния без учета состояния»? Если пользователь перемещается в сторону от представления, как контейнер уничтожает фазу без состояния? И как контейнер гарантирует, что все запросы к этому представлению с включенным факсимильным компонентом переходят в тот же экземпляр компонента? Пожалуйста, просветите меня! Заранее спасибо :) –

+0

Я хотел сказать, что Stateless EJB можно использовать в Viewscoped Managed Bean. Почему бы и нет – Makky