2012-08-09 2 views
1

ellojsf 2 모든 요청마다 세션 빈을 생성했습니다.

2 개의 Managed Bean, 하나의 View 범위가 있고 다른 하나는 Scoped입니다. 내가 실행할 때보기, 콩은

@ManagedBean 
@ViewScoped 
public class InvoiceController implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @ManagedProperty(value="#{invoiceService}") 
    private InvoiceService invoiceService; 

세션이 나는 패널이 렌더링 할 필요가있는 경우 세션을 결정하는 데 사용되는 플래그를 개최 콩을 범위 사용하고

@ManagedBean 
@SessionScoped 
public class InvoiceService implements Serializable{ 

로 콩을 범위로 정의 범위 디버그를 통해이 메소드를 호출 할 때마다 sesison 빈의 메소드를 호출 할 때마다 빈의 새 인스턴스가되므로 요청 사이에 내 플래그의 값이 유지되지 않습니다.

내가 뭘 잘못하고 있니?

답변

7

javax.faces.bean 패키지가 아닌 패키지에서 @SessionScoped을 가져온 경우 이러한 현상이 발생할 수 있습니다. 전자는 CDI @Named 콩에서만 작동하지만 후자는 JSF @ManagedBean 콩에서만 작동합니다.

유효한 범위가없는 JSF @ManagedBean의 기본값은 @NoneScoped입니다. 즉, 빈을 참조하는 모든 단일 EL 표현식 (예 : @ManagedProperty)에서 새로 작성됨을 의미합니다. 이것은 당신이보고있는 증상을 설명합니다.

+0

감사합니다. BalusC, 가져 오기를 확인했으며 javax.faces.bean 패키지입니다. – MGB

+0

그러면 더 큰 문제가 생겼습니다. 뷰 범위 bean도 재 작성 또는 유지 보수됩니까? 서버 또는 클라이언트 측 상태 저장을 사용하고 있습니까? 후속 요청에서 세션 쿠키가 올바르게 유지 관리됩니까? – BalusC

+0

와우, 그리고 이것은 내가 간단한 비트를하려고 할 때입니다. 확인하겠습니다. - 감사합니다. – MGB

0

비슷한 문제가있었습니다. 일부 값을 갱신하기 위해 세션 | 위 Bean의 메소드를 호출하는 뷰 | 위 Bean에서 save-method를 사용합니다.

내가 (내 비 자바 전문가 영어 변명) 디버깅에 의해 발견 무엇 :

첫 페이지를로드 할 때, 주입 된 세션 빈의 인스턴스 번호는 예 111111 위한 그러나이었다 save-method (그리고 commandButton이나 액션 리스너 btw와 같은 액션에 의해 호출 된 다른 모든 메소드), 세션 빈은 갑자기 다른 인스턴스 (예 : 222222)였습니다.

두 인스턴스 111111과 222222 모두 매우 동일한 값을 포함합니다. 내가 지금 호출 한 모든 메서드는 222222 인스턴스에서 수행되었으며 원하는대로 값을 변경했습니다. 그러나 111111 인스턴스는 변경되지 않고 그대로 유지되었습니다.

그래서 222222는 기본적으로 111111의 깊은 (?) 복제본이었으며 사본도 아닙니다.

그러나 save-method가 완료되고 페이지가 다시로드 된 후 원본 111111 인스턴스가 뷰 범위 bean에서 다시 사용되었습니다.222222 인스턴스가 방금 쓰레기통에 던졌습니다. 이 문제에 대한

내 솔루션 : 나는 더 이상 ManagedProperty 주입을 사용하지 않는

.

가 대신 내가 (뷰가 빈 방법을 범위 일명에서) 필요할 때마다 세션 빈 얻을 수있는 헬퍼 코드를 만들어 : 위의 예를 들어

public Object getSessionBean(String sessionBeanName) 
    { 
     return FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, sessionBeanName); 
    } 

를 호출은 다음과 같습니다

InvoiceService invoiceService = (InvoiceService) 도우미.getSessionBean ("invoiceService");

메소드에서 호출하고 뷰 범위 Bean의 필드로 저장하지 마십시오.

나는 이것이 어떻게 든 당신의 문제를 해결하는 데 도움이되기를 바랍니다.

관련 문제