2013-04-15 7 views
1

UserControlSessionScope이고, 사용자가 register 시스템에 로그인 한 후 시스템에 로그인하려고 시도했을 것입니다.사용자 가입 후 Bean null입니까?

동일한 빈이 사용되지만 두 번째 시도에서 한 번 시도 (예 : 잘못된 passwod로 시도) 한 후에 내 bean이 null이라는 예외가 표시됩니다. 이유는 무엇입니까?

내가 register formlogin form에서 같은 composition를 사용

<!DOCTYPE html> 
<ui:composition 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 

    E-Mail:<h:message id="m_email" for="email" styleClass="red" /><br/> 
    <h:inputText id="email" value="#{userC.user.email}" maxlength="45" validatorMessage="e-mail inválido" > 
     <f:validateLength minimum="6" maximum="45" /> 
     <f:ajax event="blur" render="m_email" /> 
    </h:inputText> 
    <br/> 
</ui:composition> 

을 처음으로 작업에하지만 두 번째에,하지 않습니다. 이 내 빈입니다

/resources/jsf/composition/body/user/form/email.xhtml @9,108 value="#{userC.user.email}": Target Unreachable, 'null' returned null 

, UserControl :

@ManagedBean(name="userC") 
@SessionScoped 
public class UserControl implements Serializable{ 
    private static final long serialVersionUID = 7708365499838642904L; 

    @EJB UserEAO userEAO; 
    @EJB AddressEAO addressEAO; 

    private User user; 

    private Message message; 

    /* 
    * Variable 
    */ 
    private boolean logged; 

    public UserControl(){ 
     user = new User(); 
     user.setAddressCity(new AddressCity()); 
     user.setAddressState(new AddressState()); 
     user.setAddressCountry(new AddressCountry()); 

     logged = false; 
    } 
    .. methods 
} 

잘못 내 objectsconstructor에 시작되어 나에게이 예외를 감안할 때? UserControl

갱신 전체 코드 : user가에서 null 경우

package com.hi.mvc.controller; 

import java.io.IOException; 
import java.io.Serializable; 
import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import javax.ejb.EJB; 
import javax.faces.application.FacesMessage; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.context.ExternalContext; 
import javax.faces.context.FacesContext; 

import com.hi.mvc.eao.AddressEAO; 
import com.hi.mvc.eao.UserEAO; 
import com.hi.mvc.model.AddressCity; 
import com.hi.mvc.model.AddressCountry; 
import com.hi.mvc.model.AddressState; 
import com.hi.mvc.model.User; 
import com.hi.utility.Crypto; 
import com.hi.utility.Email; 
import com.hi.utility.Message; 

@ManagedBean(name="userC") 
@SessionScoped 
public class UserControl implements Serializable{ 
     private static final long serialVersionUID = 7708365499838642904L; 

     @EJB UserEAO userEAO; 
     @EJB AddressEAO addressEAO; 

     private User user; 

     private Message message; 

     /* 
     * Variable 
     */ 
     private boolean logged; 

     public UserControl(){ 
       user = new User(); 
       user.setAddressCity(new AddressCity()); 
       user.setAddressState(new AddressState()); 
       user.setAddressCountry(new AddressCountry()); 

       logged = false; 
     } 

     /* 
     * CRUD 
     */ 
     public String register(){ 
       if (userEAO.find(user.getEmail()) == null){ 
         defineUser(); 

         message = userEAO.create(user); 
         //sending user email confirmation 
         if (message.getCode() == 0) { 
           message = new Message(1); 
           message.setEmail(user.getEmail()); 

           sendConfirmationEmail(user); 
           return "/pages/system/message.xhtml?faces-redirect=true"; 
         }else 
           //user already registered and trying to register again 
           message = new Message(-1002); 
       } 

       addMessage(); 
       return null; 
     } 

     public String update() { 
       message = userEAO.update(user); 

       this.addMessage(); 
       return null; 
     } 

     public String delete(){ 
       message = userEAO.delete(user); 
       if (message.getCode() >= 0) 
       try { 
         ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
         ec.invalidateSession(); 

         message = new Message(3001); 
         addMessage(); 

         ec.redirect(ec.getRequestContextPath() + "/pages/system/message.xhtml"); 
       } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
       } 
       addMessage(); 
       return null; 
     } 

     /* 
     * Log in/off 
     */ 
     public String login(){ 
       String password = user.getPassword(); 
       user = userEAO.find(user.getEmail()); 
       // if user was found 
       if (user != null){ 
         if (user.getEmailConfirmed()){ 
           // with facebook registration, password is empty, so we avoid login empty and check the password 
           if (!user.getPassword().isEmpty() && Crypto.check(password, user.getPassword())){ 
             //user = addressEAO.findByUser(user.getId()); 
             logged = true; 

             return "/index.xhtml?faces-redirect=true"; 
           }else 
             message = new Message(-2000); 

         }else 
           message = new Message(-1003); 
       }else 
         message = new Message(-2000); 

       addMessage(); 
       return null; 
     } 

     public void logout(){ 
       try { 
         ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
         ec.invalidateSession(); 
         ec.redirect(ec.getRequestContextPath() + "/index.xhtml"); 
       } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
       } 
     } 

     /* 
     * Functions 
     */ 
     public void defineUser(){ 
       encryptPassword(user); 
       user.setMemberSince(new Date()); 
       user.setAcceptanceRate(0); 
       user.setResponseRate(0); 

       // user do not confirm email yet 
       user.setEmailConfirmed(false); 

       // set address to be empty 
       user.getAddressCity().setCity(" "); 
       user.getAddressState().setState(" "); 
       user.getAddressCountry().setCode(" "); 
       defineAddress(); 
     } 

     public void defineAddress(){ 
       AddressCity addressCity = addressEAO.findCity(user.getAddressCity().getCity()); 
       if (addressCity == null){ 
         addressCity = new AddressCity(); 
         addressCity.setCity(user.getAddressCity().getCity()); 
         addressEAO.createCity(addressCity); 
       } 
       user.setAddressCity(addressCity); 

       AddressState addressState = addressEAO.findState(user.getAddressState().getState()); 
       if (addressState == null){ 
         addressState = new AddressState(); 
         addressState.setState(user.getAddressState().getState()); 
         addressEAO.createState(addressState); 
       } 
       user.setAddressState(addressState); 

       AddressCountry addressCountry = addressEAO.findCountry(user.getAddressCountry().getCode()); 
       if (addressCountry == null){ 
         addressCountry = new AddressCountry(); 
         addressCountry.setCode(user.getAddressCountry().getCountry()); 
         addressEAO.createCountry(addressCountry); 
       } 
       user.setAddressCountry(addressCountry); 
     } 

     /* 
     * Date 
     */ 
     public Date convertDate(String date){ 
       try { 
         DateFormat formatter = new SimpleDateFormat("MM/dd/yy"); 
         return (Date)formatter.parse(date); 
       } catch (ParseException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
       } 
       return null; 
     } 

     /* 
     * E-Mail 
     */ 
     public void sendConfirmationEmail(User u){ 
       Email email = new Email(); 
       email.setUser(u); 
       email.setSubject("Hotel Informal - Por favor, confirme seu endereço de email"); 
       email.simpleEmail(); 
     } 

     public void sendWelcomeEmail(User u){ 
       Email email = new Email(); 
       email.setUser(u); 
       email.setSubject("Hotel Informal - Olá, seja bem-vindo(a)"); 
       email.simpleEmail(); 
     } 

     public String resendEmailConfirmation(){ 
       sendConfirmationEmail(user); 
       message = new Message(2); 
       message.setEmail(this.user.getEmail()); 

       return "/pages/system/message.xhtml?faces-redirect=true"; 
     } 

     /* 
     * Password 
     */ 
     public void encryptPassword(User u) { 
       if (u.getPassword() != null){ 
         u.setPassword(Crypto.encrypt(u.getPassword())); 
       } 
     } 

     public String changePassword(){ 
       encryptPassword(user); 
       message = userEAO.update(user); 
       if (message.getCode() >= 0) 
         message = new Message(2002); 

       addMessage(); 
       return null; 
     } 

     public Message checkPassword(User user) { 
       if (user == null) 
         return new Message(-3000); 

       if (Crypto.check(user.getPassword(), user.getPassword())) { 
         return new Message(1); 
       } else 
         return new Message(-2000); 
     } 

     public String forgotPassword(){ 
       user = userEAO.find(user.getEmail()); 
       if (user != null){ 
         Email email = new Email(); 
         email.setUser(user); 
         email.setSubject("Hotel Informal - Redefinir senha"); 
         email.simpleEmail(); 

         message = new Message(6); 
         message.setEmail(user.getEmail()); 
       }else 
         message = new Message(-1004); 

       addMessage(); 
       return "/pages/system/message.xhtml?faces-redirect=true"; 
     }  

     public String resetPassword(){ 
       encryptPassword(user); 
       userEAO.update(user); 

       Email email = new Email(); 
       email.setUser(user); 
       email.setSubject("Hotel Informal - Senha redefinida"); 
       email.simpleEmail(); 

       message.setEmail(user.getEmail()); 
       message = new Message(2001); 

       addMessage(); 
       return "/pages/system/message.xhtml?faces-redirect=true"; 
     } 

     private void addMessage(){ 
       FacesMessage fMessage = new FacesMessage(message.getMessage()); 
       FacesContext.getCurrentInstance().addMessage(null, fMessage); 
     } 

     // get's & set's 

     public Message getMessage() { 
       return message; 
     } 

     public void setMessage(Message message) { 
       this.message = message; 
     } 

     public User getUser() { 
       return user; 
     } 

     public void setUser(User user) { 
       this.user = user; 
     } 

     public boolean isLogged() { 
       return logged; 
     } 

     public void setLogged(boolean logged) { 
       this.logged = logged; 
     } 


} 
+0

이것이 문제인지는 확실치 않지만 영속적 인 범위가 지정된 관리 Bean의 작동 방식에 대한 일반적인 오해가 있다고 생각합니다. 요청 응답 사이클 후에는 bean 객체 자체가 파괴되고 모델 값만 유지됩니다. 두 번째 응답에서 bean 객체는 실제로 * 재 작성되고 * 이전 직렬화 된 모델 값은 새 bean 인스턴스에 적용됩니다. 초기화 메소드에'@ PostConstruct' 주석을 사용하여 사용자에 대해 null 검사를 수행 할 수 있으며, null 인 경우 새 User 객체를 작성하면 문제가 해결 될 수 있습니다. –

+0

@ maple_shaft, 올바르게 이해한다면 항상'constructor'과'@ PostConstruct'를 구현해야합니다. –

+1

모든 코드를 볼 수 없기 때문에, 내가해야 할 일을 말할 수는 없으며 SessionScoped 관리 Bean에 대해 알려주고 있습니다. 생성자는 모든 클라이언트 요청에서 호출됩니다. PostConstruct는 Bean을 초기화하는보다 적절한 방법입니다. 마지막으로 저장된 빈 값은 생성자 이후와 PostConstruct 이후까지 설정되지 않기 때문에 null 체크도 할 수 있다고 제안했습니다. –

답변

0

maple_shaftkolossun의 제안에 따라 확인하기 위해, this 제안 다음 내 문제를 해결하기에 충분 아니었지만, public User getUser() 방법은

@PostConstruct 
public void init(){ 
    if (user == null){ 
     user = new User(); 
     logged = false; 
    } 

    if (user != null && user.getAddressCity() == null) 
     user.setAddressCity(new AddressCity()); 

    if (user != null && user.getAddressState() == null) 
     user.setAddressState(new AddressState()); 

    if (user != null && user.getAddressCountry() == null) 
     user.setAddressCountry(new AddressCountry()); 
} 

그리고 :

public User getUser() { 
    init(); 
    return user; 
} 

내가 개체 user와 다른 클래스가 항상 초기화되어 있는지 확인이 방법. 아직도 null 체크인을 수행하는 것이 @PostConstruct으로 충분하지 않다는 것을 이해하지 못하기 때문에 동일한 오류가 발생합니다.

관련 문제