2014-06-30 7 views
0

두 개의 ManagedBeans (SessionHandler 및 OrderHandler)가 있습니다. 둘 다 세션 범위입니다.ManagedProperty를 사용할 수 없습니다.

SessionHandler :

@ManagedBean(name="session") 
@SessionScoped 
public class SessionHandler { 

    private Account account; 

    public String login() { 
     try { 
      // ... login method ... 

      return("bookinglist.xhtml?faces-redirect=true"); 
     } 
     catch (Exception e) { 
      // ... exception handling ... 
     } 
    } 

    // ... getter & setter ... 
} 

OrderHandler :

<p>Welcome, #{sessions.account.name}!</p> 

<ui:repeat value="#{order.bookingList}" var="item"> 
    <!-- ... items ... ---> 
</ui:repeat> 
:

@ManagedBean(name="order") 
@SessionScoped 
public class OrderHandler { 

    @ManagedProperty(value="#{session.account}") 
    Account account; // getter and setter 

    public OrderHandler() { 
     this.createList(); 
    } 

    private void createList() { 
     // method creates an ArrayList of bookings 
     // it uses this.account.getId() for a SQL statement 
    } 
} 

bookinglist.xhtml에서 나는 환영 텍스트와 내 목록을 표시 할

welcome 텍스트가 표시되지만 내 sql 문에서 accountID가 null이므로 내 목록이 비어 있습니다. AccountID = 1 (예)의 문장이 작동합니다. 나중에 예약 절차에서 accountID를 사용할 수 있습니다 (다시 선언하거나 덮어 쓰지 않고).

로그인 후 바로 등록 할 수 없다는 것이 문제라고 생각합니다.하지만 그 이유는 모르겠습니다. 누군가 나를 도울 수 있습니까?

+1

:

@PostConstruct private void init() { // this will be called after constructor call, and property injection this.createList(); } 

현재 @PostConstruct 주석에 대한 자세한 내용을보실 수 있습니다? – Omar

+0

효과 없음 ... 그리고 다른 메소드를 위해서는 SessionHopler가 필요합니다. – pril

답변

0

@ManagedProperty을 사용하는 경우 bean 생성자가 호출 된 후 번 이러한 속성을 한 번 주입해야한다는 사실을 명심해야합니다. 이유는 JSF가 bean이 완전히 생성되었을 때만 속성을 삽입 할 수 있기 때문입니다.

사실 현재 코드에서 createList()이 호출 된 후 account이 삽입됩니다. 당신이 생성자이 완료된 후 createList()를 호출 할 필요가

// bean instantiation step 
-> OrderHandler constructor called 
    -> createList called 

// bean property injection step 
-> Account injected 

는이 문제를 해결하기 위해, 그리고 account 이미 주입 : 당신이 OrderHandler를 디버깅 할 경우, 당신은 매우 가능성이 다음 실행 순서를 볼 수 있습니다. 당신은 @PostConstruct 주석 방법으로 그것을 얻을 수 있습니다 무엇 RequestScoped` @ "OrderHandler을" '만들기에 대해

http://docs.oracle.com/javaee/7/api/javax/annotation/PostConstruct.html