2009-09-29 2 views
1

바로 이것이 좋은 생각되지 않을 수도 있습니다 생각에 나는 오전 :) 때 (JSF - 정적 맥락에서 FacesContext.getCurrentInstance()를 호출

private static Application app = FacesContext.getCurrentInstance() 
     .getApplication(); 

... 또는 FacesContext.getCurrentInstance에 대한 다른 호출 현재 실행 쓰레드가 서블릿 요청 때문인지 확신 할 수 없습니까?

내가 이해하는 방식으로 FacesContext.getCurrentInstance()는 현재 faces 컨텍스트를 스레드 (예 : ThreadLocal 변수)에 할당하여 작동합니다. 보통 은 JSF 백킹 빈이나 JSF 컴포넌트 클래스와 같은 클래스에서 작동합니다. 클래스를로드하고 클래스 멤버 (정적 변수)를 인스턴스화하는 실행 스레드는 일반적으로 FacesServlet 요청이 될 것이기 때문입니다. 그러나 나는 아직도 그것을 의지하는 것이 좋은 생각이라고 생각하지 않는다.

동의합니까 또는 동의하지 않습니까? 아이디어? 감사.

+0

확실히 좋은 생각은 아닙니다. 근본 문제는 무엇입니까? 어쩌면 우리는 더 나은 해결책을 제공 할 수 있습니다. – Drew

+0

정말 확실하지 않습니다 - 그건 내 코드가 아닙니다! 나는 물건을 많이 쌓은 후에 프로젝트에 배정되었으므로 이제는 결함 등을 고치고 있습니다. 시간이 있으면 살펴보고 다시 생각해 보겠습니다. 건배. –

답변

1

초기화 중에 FacesContext.getCurrentInstance()를 사용하면 컨텍스트에 따라 좋은 아이디어가 아닐 수도 있습니다.

정적 var에 할당하는 것이 좋은 생각 인 시나리오를 상상할 수는 없습니다.

2

이것은 실제로하고 싶지 않은 모양입니다.

경우 해야ApplicationFactory를 통해 초기화하는 것이 아마 더 좋은 방법이 될 것입니다, 응용 프로그램에 정적 참조를 얻을 :

public final class CustomApplicationFactory extends ApplicationFactory { 
    private static volatile Application APPLICATION; 
    private final ApplicationFactory decorated; 

    public CustomApplicationFactory(ApplicationFactory decorated) { 
    this.decorated = decorated; 
    } 

    @Override public Application getApplication() { 
    APPLICATION = decorated.getApplication(); 
    return APPLICATION; 
    } 

    @Override public void setApplication(Application application) { 
    APPLICATION = application; 
    decorated.setApplication(application); 
    } 

    public static Application getApp() { 
    return APPLICATION; 
    } 
} 

faces-config.xml에 등록됩니다. 이 데모 클래스는 하나의 앱으로 격리하지 않으면 관련 버그가 ClassLoader에 노출되어 취약합니다.

당신이하려는 일은 무엇이든 할 수있는 더 좋은 방법 일 것입니다.

관련 문제