2011-11-01 5 views
0

previous question에 계속해서 응용 프로그램의 세션이 처음 시작될 때 세션 범위의 JSF 빈을 초기화하려고하므로 어떤 페이지에 관계없이 사용자가 빈을 사용할 수 있습니다. 그들은 내 웹 응용 프로그램에서 먼저 액세스합니다. 내 맞춤 청취자 :HttpSessionListener에서 JSF SessionScoped 빈을 초기화 할 때 StackOverflow 오류가 발생했습니다.

public class MyHttpSessionListener implements HttpSessionListener { 

    @Override 
    public void sessionCreated(HttpSessionEvent se) { 
     if (FacesContext.getCurrentInstance().getExternalContext().getSessionMap() 
       .get("mySessionBean") == null) { 
      FacesContext.getCurrentInstance().getExternalContext().getSessionMap() 
        .put("mySessionBean", new MySessionBean()); 
     } 
    } 
} 

그러나 이로 인해 스택 오버플로 오류가 발생합니다. SessionMap 클래스의 put() 메서드가 새 HttpSession을 만들려고 시도하여 내 청취자와 함께 무한 루프가 발생하는 것으로 보입니다. 이 이슈를 실행하지 않고 애플리케이션 세션이 처음 시작될 때 어떻게 JSF 세션 범위 Bean을 초기화 할 수 있습니까?

내가 감사는 WebSphere 7에

실행, 봄 3 JSF 2를 사용하고 있습니다!

답변

2

세션이 그 시점에서 완전히 작성되지 않았습니다. JSF의 getSessionMap()은 청취자 메소드가 종료 될 때만 세션이 컨텍스트에 삽입되고 request.getSession()까지 사용할 수 있습니다.

대신 event 인수에서 세션을 가져와 setAttribute() 메서드를 사용해야합니다. JSF는 세션 범위가 지정된 관리 Bean을 조회 및 저장하고 이미 존재하는 경우 새로운 세션을 생성하지 않습니다. 이 세션 빈은 이미있는 그 시점 불가능에서의 나는이 불필요한 nullcheck을 제거

public void sessionCreated(HttpSessionEvent event) { 
    event.getSession().setAttribute("mySessionBean", new MySessionBean()); 
} 

참고. 구체적인 문제에


관련없는, 당신은 실제로 JSF가 관리하지 않는 구현에 존재한다 FacesContext에 의존해서는 안됩니다. 세션이 비 JSF 요청 중에 생성 될 가능성이 큽니다.

관련 문제