2013-01-06 4 views
6

내가 이런 종류의 JSF 콩 구조를 가지고 :ViewScoped Bean에서 SessionScope의 ManagedProperties - Transient?

@ManagedBean 
@ViewScoped 
public class ViewBeany implements Serializable { 

.... 
    @ManagedProperty(value='#{sessionBeany}) 
    transient private SessionBeany sessionBeany; 
... 

    public getSessionBeany() { ... }; 
    public setSessionBeany(SessionBeany sessionBeany) { ... }; 

} 

transient에 대한 이유는 세션 빈은 일부 비 직렬화 회원을 보유하고 직렬화를 할 수 없다는 것입니다.

이 방법이 유용할까요?
그렇지 않은 경우 SesionBeany을 직렬화 할 수 없다는 문제를 해결할 수 있지만 뷰 범위의 관리 속성으로 관리해야합니다.

감사합니다.

+0

, 당신은 또한 단지 server''로'STATE_SAVING_MODE'을 설정하고 모두 클라이언트에 – kolossus

답변

12

이것은 작동하지 않습니다. 뷰 범위 Bean이 직렬화되면 모든 transient 필드를 건너 뜁니다. JSF는 직렬화 복원 후에 관리 속성을 다시 추가하지 않으므로 NPE 만 발생시키는 세션 범위 Bean 속성이없는 뷰 범위 bean으로 끝납니다.

이 특정 구문에서 가장 좋은 방법은 게터에 게으른로드를 도입하고 직접 필드 액세스 대신 getter로 세션 빈을 얻는 것입니다. 당신이 너무 제한하지 않는 경우

private transient SessionBeany sessionBeany; 

public SessionBeany getSessionBeany() { // Method can be private. 
    if (sessionBeany == null) { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     sessionBeany = context.getApplication().evaluateExpressionGet(context, "#{sessionBeany}", SessionBeany.class); 
    } 

    return sessionBeany; 
} 
+0

감사를보기를 직렬화하는 것을 방지 할 수있다. JSF에이 문제에 대한 '능률적 인'해결책이 없다는 것에 놀랐습니다. 드물지 않다고 생각합니다. – Ben

+2

스테이트 풀 EJB가 아니 었는지 궁금했습니다. EJB는 직렬화 가능 프록시로 주입되므로 직렬화에 대해 걱정할 필요가 없습니다. – BalusC