2012-04-26 2 views
1

이 나의 조각이다 mainController.showComponent()nullPointerException 내가 알기로 Java가 html을 먼저로드하여 어떤 Java 클래스를 호출하는지 알기 때문에 mainController (아직 호출되지 않은 HomeController에서 확장 됨)에 액세스하려고 할 때이 null 포인터를 얻습니다.JSF EL은 조건

. maisController가 설정된 경우 프래그먼트 내부를 검사하는 방법은 무엇입니까? 여기

내가 항상 true을 반환 지금까지

<ui:fragment rendered="#{not empty mainController ? true : false}">

을 시도했습니다 것입니다.

package com.erp3.gui.controllers; 

import java.io.IOException; 
import javax.faces.bean.ManagedBean; 
import javax.faces.context.ExternalContext; 
import javax.faces.context.FacesContext; 

@ManagedBean 
public class MainController { 

    public LoginController loginController; 
    public ExternalContext ec; 

    public void checkUserSession() throws IOException { 
     ec = FacesContext.getCurrentInstance().getExternalContext(); 
     loginController = (LoginController) ec.getSessionMap().get("loginController"); 
     loginController = (LoginController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginController"); 
     if (loginController == null || !loginController.getIsLoggedIn()) { 
      ec.redirect(ec.getRequestContextPath() + "/views/login.html"); 
     } 
    } 

    public Boolean showComponent() { 
     return this.loginController.getIsLoggedIn(); 
    } 
} 

내 방법 showComponent()는 당신이 showComponent를 호출 할 때 loginController가 null 것으로 보인다 loginController

답변

2

그것은 발생합니다. 다른 @ManagedBean 인 경우 해당 속성을 Managed 속성으로 주입해야합니다. 이렇게하면 세션 맵에서 수동으로 가져올 필요가 없습니다. 또한 MainController에 유효한 Bean 범위를 제공해야합니다. 범위가 없으면 EL 표기 #{mainController}마다 에 새 표식이 생성됩니다.

<ui:fragment rendered="#{mainController.showComponent}"> 

을 왜 그냥 직접 #{loginController}에 액세스하지 않습니다

@ManagedBean 
@RequestScoped 
public class MainController { 

    @ManagedProperty("#{loginController}") // +getter+setter 
    public LoginController loginController; 

    @PostConstruct // Will be invoked directly after construction and managed property injection. 
    public void checkUserSession() throws IOException { 
     ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
     if (!loginController.getIsLoggedIn()) { 
      ec.redirect(ec.getRequestContextPath() + "/views/login.html"); 
     } 
    } 

    public boolean isShowComponent() { 
     return loginController.getIsLoggedIn(); 
    } 

} 

그럼 당신은 그것을 사용할 수 있습니까? JSF @ManagedBean결코null이기 때문에 귀하의 질문에 관해서는

<ui:fragment rendered="#{loginController.isLoggedIn}"> 

#{not empty mainController ? true : false} 항상 true를 평가하는 이유입니다. EL 스코프에 존재하지 않으면 JSF가 자동으로 EL 스코프를 작성합니다.

+0

다음 요청에서 손실 될 것이기 때문에 그렇지 않습니까? 세션 객체에 액세스해야합니까? – Gerep

+0

세션 맵에 분명히 나와 있기 때문에 전체 세션에서 사용할 수 있습니다. 이것은'LoginController'가 실제로'@ManagedBean @ SessionScoped' 일 때 사실입니다. – BalusC

+0

'loginController.isLoggedIn'을 사용하면 작동하지 않습니다. – Gerep

1

에서 세션 객체의 속성을 반환 :

여기 내 MainController 클래스입니다. 방법 getLoginController 만들기 : 분명히 null입니다 NullPointerExceptionloginController 때문에

public getLoginController() { 
    (LoginController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginController"); 
} 

public Boolean showComponent() { 
    return getLoginController() != null && getLoginController().getIsLoggedIn(); 
}