2010-12-19 33 views
8

Tôi tự hỏi liệu có thể quan sát sự kiện CDI với nhiều bean sao lưu có phiên JSF 2.0 hay không. Tôi nghĩ rằng tôi có thể đẩy sự kiện/dữ liệu đến nhiều phiên bằng cách quan sát sự kiện.Các sự kiện CDI quan sát được trên các hạt sao lưu JSF có lớp phiên

Tôi đã thiết lập một thử nghiệm nhỏ cho phép người dùng kích hoạt sự kiện bằng cách sử dụng nút trên trang (được gắn với phương thức trong bean sao lưu được kích hoạt phiên thực sự kích hoạt sự kiện). Tôi nghĩ rằng nếu tôi mở hai trình duyệt khác nhau, hai phiên sẽ được tạo và sự kiện này sẽ thông báo cho từng hạt đậu sao lưu.

Tuy nhiên, khi chạy thử nghiệm nhỏ và nhấp vào nút để kích hoạt sự kiện trên một trong các trình duyệt, tôi thấy rằng sự kiện chỉ thông báo cho một trong các phiên phạm vi đậu. Nó chỉ thông báo cho bean mà từ đó sự kiện đã được kích hoạt (nghĩa là - nếu tôi nhấp vào nút trong trình duyệt 1 thì phiên đậu được sao chép phiên trong trình duyệt 1 sẽ được thông báo, và nếu tôi nhấp vào nút trong trình duyệt 2, bean sẽ sao lưu phiên trình duyệt 2 được thông báo).

Tôi đã ấn tượng rằng các sự kiện sẽ thông báo cho tất cả các phiên bản bean. Tuy nhiên, điều này dường như không đúng. Tôi có thể làm được điều này không? Tôi chỉ có một cái gì đó thiết lập sai?

CẬP NHẬT để hiển thị những gì mã của tôi trông giống như:

Một đoạn jsfpage.xhtml để bắn một sự kiện và hiển thị dữ liệu phiên scoped:

 <h:form> 
      <h:outputText value="#{BackingBean.property}" /> 
      <p:commandButton value="Fire Event" action="#{EventFirer.fireEvent}" /> 
     </h:form> 

Session đậu có vỏ bọc nhận sự kiện:

 
@Named 
@SessionScoped 
public class BackingBean implements Serializable { 

    private String property; 

    public String getProperty() { 
     return property 
    } 

    public void listenForChange(@Observes EventObj event) { 
     logger.log(Level.INFO, "Event received"); 
     property = event.toString(); 
    } 
} 

Đơn scoped đậu kích hoạt sự kiện:

 
@Named 
@ApplicationScoped 
public class EventFirer implements Serializable { 

    @Inject 
    private Event events; 

    public String fireEvent() { 
     logger.log(Level.INFO, "Event fired"); 
     events.fire(new EventObj()); 
     return null; 
    } 
} 
+0

Bạn nên thêm mã của mình, Thuyền trưởng. –

+0

Bạn đã bao giờ tìm thấy giải pháp chưa? Tôi đang cố gắng làm như vậy và muốn đẩy dữ liệu đến tất cả các hạt '@ SessionScoped' của tôi. – Reitffunk

Trả lời

1

Đầu tiên, bạn nên xác định loại sự kiện:

@Inject 
private Event<EventObj> events; 

Ngoài ra không có dấu hiệu trong spec rằng sẽ hạn chế các trường hợp bean mà phương thức quan sát được gọi. Tôi sẽ gửi một vấn đề về điều này (trong trình gỡ rối của việc thực hiện bạn đang sử dụng. Có lẽ Weld?)

+0

Tôi không thể lấy đậu javax.enterprise.context.SessionScoped để quan sát các sự kiện được kích hoạt bởi một hạt javax.enterprise.context.ApplicationScoped. Một ngoại lệ được ném: WELD-001303 Không có ngữ cảnh hoạt động nào cho phạm vi loại javax.enterprise.context.ConversationScoped. – Steven

0

Tôi đã phát hiện ra rằng tất cả các nhà quan sát đã đăng ký đều bị sa thải.

Đáng chú ý nhất là nếu tôi có người quan sát trên một cuộc hội thoại phạm vi đậu và đậu đó không hoạt động trong cuộc trò chuyện hiện tại thì khi sự kiện được kích hoạt, một trường hợp mới được tạo đặc biệt để nhận nó!

Các vấn đề liên quan