2013-03-20 2 views
0

세션 범위 bean을 뷰 범위 bean에 삽입 할 때마다, bean을 호출 할 때 NullPointerException이 발생합니다. 이 문제는 직접 auto -instantiate a session bean? 다음뷰 범위 콩에서 세션 범위 콩을 자동으로 인스턴스화하기

와 관련된 것은 내가 지금까지 뭘하려 :

얼굴-config.xml에

<managed-bean> 
    <managed-bean-name>sessionBean</managed-bean-name> 
    <managed-bean-class>com.example.SessionBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 
<managed-bean> 
    <managed-bean-name>viewBean</managed-bean-name> 
    <managed-bean-class>com.example.ViewBean</managed-bean-class> 
    <managed-bean-scope>view</managed-bean-scope> 
    <managed-property> 
     <property-name>sessionBean</property-name> 
     <property-class>com.example.SessionBean</property-class> 
     <value>#{sessionMBean}</value> 
    </managed-property> 
</managed-bean> 

SessionBean.java :

package com.example; 

public class SessionBean { 

    public SessionBean() { 
     System.out.println("Session is instantiated."); 
    } 

    public void sayHello() { 
     System.out.println("Hello from session"); 
    } 
} 

ViewBean.java :

package com.example; 

public class ViewBean { 

    private SessionBean sessionBean; 

    private String text = "Look at me!"; 

    public ViewBean() { 
     System.out.println("View bean is instantiated."); 

     sessionBean.sayHello(); 
    } 

    public SessionBean getSessionBean() { 
     return sessionBean; 
    } 

    public void setSessionBean(SessionBean sessionBean) { 
     this.sessionBean = sessionBean; 
    } 

    public String getText() { 
     return text; 
    } 
} 

및 index.xhtml 관련 내용 :

<f:view> 
    <h:outputText value="#{viewBean.text}"/> 
</f:view> 

을 그리고 이것은 내가 무엇을 얻을 다음에 웹 로직 - 10.3.6에

com.sun.faces.mgbean.ManagedBeanCreationException: Cant instantiate class: com.example.ViewBean. 
... 
Caused by: java.lang.NullPointerException 
    at com.example.ViewBean.(ViewBean.java:12) 

이 실행 (또는 오히려 실행되지 않습니다) jsf-2-0.war이 라이브러리로 배포되었습니다.

내가 뭘 잘못하고 있니? 이 컨테이너 버그가 아니길 바래요 ...

+0

시도는 일반 자바의 관점에서 생각하기 : 어떻게'viewBean.setSessionBean (세션빈을) 할 이제까지 수'전'viewBean = 새로운 ViewBean() '? – BalusC

답변

1

@ViewScoped 생성자에서 @SessionScoped 콩에 액세스 할 수 없습니다. @SessionScoped bean은 @ViewScoped bean의 생성자가 호출 된 후에 설정됩니다. init 메서드의 @PostConstruct 주석을 사용하여 @SessionScoped bean에 액세스하십시오.

public ViewBean() { 
    System.out.println("Constructor viewbean"); 
} 

@PostConstruct 
public void init() { 
    sessionBean.sayHello(); 
} 

추가 링크 :
Why use @PostConstruct?
Spring Injection - access to the injected object within a constructor

+0

고맙습니다. 당연히 말이됩니다. 아직 만들어지지 않은 것을 주입 할 수는 없습니다. – Tom