2012-10-22 30 views
5

Tôi có một bó của eagerApplicationScoped đậu được quản lý. Một số người trong số họ được tiêm vào những người khác bằng cách chú thích ManagedProperty, tạo thành một cây phụ thuộc. Mỗi bean phụ thuộc thao tác với cha mẹ của nó sau khi xây dựng.Ứng dụng EagerSố đậu được quản lý được kiểm tra được xây dựng nhiều lần

Tuy nhiên, có vẻ như một phiên bản mới được tạo cho mỗi lần tiêm, do đó thực hiện các thao tác trước đó sẽ hoàn tác. Theo hiểu biết của tôi, chỉ nên tạo một hạt ApplicationScoped một lần. Tôi đã hiểu lầm hay tại sao điều này lại xảy ra? Có phải vì họ háo hức không?

Dưới đây là một ví dụ:

ParentBean.java

package example; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 

@ManagedBean(eager = true) 
@ApplicationScoped 
public class ParentBean 
{ 
    static int initCount = 0; 

    // ... 

    @PostConstruct 
    public void init() 
    { 
     ++initCount; // Will end up being between 1 and 3. Expected always 1. 

     // ... 
    } 
} 

Child1Bean.java

package example; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 

@ManagedBean(eager = true) 
@ApplicationScoped 
public class Child1Bean 
{ 
    @ManagedProperty("#{parentBean}") ParentBean parentBean; 

    public ParentBean getParentBean() 
    { 
     return parentBean; 
    } 

    public void setParentBean(ParentBean parentBean) 
    { 
     this.parentBean = parentBean; 
    } 

    @PostConstruct 
    public void init() 
    { 
     // manipulate parentBean 
    } 
} 

Child2Bean.java

package example; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 

@ManagedBean(eager = true) 
@ApplicationScoped 
public class Child2Bean 
{ 
    @ManagedProperty("#{parentBean}") ParentBean parentBean; 

    public ParentBean getParentBean() 
    { 
     return parentBean; 
    } 

    public void setParentBean(ParentBean parentBean) 
    { 
     this.parentBean = parentBean; 
    } 

    @PostConstruct 
    public void init() 
    { 
     // manipulate parentBean 
    } 
} 
+2

bạn có thể đưa ra ví dụ về cách bạn làm điều đó không? –

+0

OK, tôi đã thêm một ví dụ. – Spomf

+0

đừng nghĩ rằng tôi sẽ thực hiện bất kỳ thay đổi nào, nhưng hãy thử '@ManagedProperty (value =" # {parentBean} ")', – Daniel

Trả lời

0

Tôi có cùng một vấn đề với cá móm 2.0 .x. Tôi đoán rằng vấn đề được kết nối với initithization đa luồng JSF. Hãy thử vô hiệu hóa nó bằng tham số com.sun.faces.enableMultiThreadedStartup.

+0

Cảm ơn, nhưng nó không có hiệu lực. Ứng dụng của tôi đang chạy trên Mojarra 2.1.6. – Spomf

+0

Bạn đã giải quyết chưa? Tôi có cùng một vấn đề –

1

Tôi hy vọng đã giải quyết được sự cố này trên Tomcat 8 + Mojarra 2.2.0. Trong trường hợp của tôi, tôi chỉ cần gỡ bỏ tuyên bố nghe từ web.xml

<listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
</listener> 

Constructor dường như được gọi là một lần sau đó.

Giới thiệu về mục nhập trình nghe, có một phần câu trả lời của BalusC là this câu hỏi.

Trong mọi trường hợp, đăng ký rõ ràng của Trình cấu hình MoListra trong web.xml thực sự chỉ cần thiết để giải quyết các máy chủ lỗi cũ như GlassFish v3 và Jetty không tìm thấy người nghe trong tệp TLD của Mojarra. Khi triển khai đến một máy chủ phong nha, toàn bộ mục nhập là không cần thiết.

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