2012-01-31 24 views
16

JSF 2.0 with GlassFish 3.0 kullanıyorum.@PostConstruct yöntemi aynı istek için iki kez çağrıldı

Ben Bean Yönetilen aşağıdaki adres: overview.xhtml Dosyadan'ı

@ManagedBean 
@RequestScoped 
public class OverviewController{ 

    private List<Event> eventList; 

    @PostConstruct 
    public void init(){ 
     System.out.println("=> OverviewController - init() - enter"); 

     System.out.println("=< OverviewController - init() - exit"); 
    } 
} 

benim overviewController farklı özelliklerini veya yöntemlerini arayacağım.

<ui:repeat var="event" value="#{overviewController.eventList}"> 
    ... 
</ui:repeat> 

Her şey gayet güzel çalışıyor ancak sorun Günlüğü Dosya geçerli: Gördüğünüz gibi, init() metodu sebepsiz ne kadar şimdiye kadar aynı istek iki kez denir

INFO: Enter : RESTORE_VIEW 1 
INFO: Exit : RESTORE_VIEW 1 

INFO: Enter : RENDER_RESPONSE 6 
INFO: => OverviewController - init() - enter 
INFO: => Overview Controller - updateSelectedTab() - enter 
INFO: =< Overview Controller - updateSelectedTab() - exit 
INFO: =< OverviewController - init() - exit 
INFO: => OverviewController - init() - enter 
INFO: => Overview Controller - updateSelectedTab() - enter 
INFO: =< Overview Controller - updateSelectedTab() - exit 
INFO: =< OverviewController - init() - exit 
INFO: Exit : RENDER_RESPONSE 6 

. Bildiğim kadarıyla, her istekte bir kez PostConstruct ile açıklanmış herhangi bir yöntem çağrılır. Yanlış mıyım?

DÜZENLEME: Sayfada AJAX kullanılmaz. Firebug ile istek sayısını kontrol ettim.

  • 1.One javax.faces.resource (GET) için css dosyası için
  • 2.One (GET) bakış için
  • 3.One: yapılan ağaç başvurusu var .xhtml (GET)
+0

Eğer ClassFish veya GlassFish demek musunuz? – Kushan

+0

@Kushan GlassFish – Ionut

+0

Herhangi bir Ajax araması yapıyor musunuz? Tarayıcının gerçekte kaç istekte bulunduğunu öğrenmek için FireBug veya benzeri eklentileri kullanın. – MrKiane

cevap

19

fasulye sınıfı. Örneğin. JSF ve CDI veya JSF ve Yay veya CDI ve Yay, vb. Fasulye üzerindeki yapılandırmanızı ve ek açıklamaları işaretleyin.

Ayrıca, CDI kullanıyorsanız ve sınıf boyunca birden çok @Named ek notu kullanıyorsanız, bu da oluşabilir. Örneğin, bir @Named, yönetilen bir fasulye ve diğeri bir @Produces getter yönteminde kaydetmek için sınıfa doğrudan. 'un gerçekten'un gerekli olup olmadığını kendinize sormanız gerekir. Ayrıca #{someObject} yerine #{bean.someObject}'u da kullanabilirsiniz. Yönetilen fasulye yöntemine de @PostConstruct sırayla sahip bazı soyut sınıfını genişletir eğer

@Named 
@RequestScoped 
public class Bean { 

    @PostConstruct 
    public void init() { 
     // ... 
    } 

    @Named 
    @Produces 
    public SomeObject getSomeObject() { 
     // ... 
    } 

} 

da olabilir bu. Ek açıklamayı buradan kaldırmalısınız.Alternatif olarak, init yöntemi özet yapmalıdır ve değil uygulayan fasulye @PostConstruct var:

public abstract class BaseBean { 

    @PostConstruct 
    public void postConstruct() { 
     init(); 
    } 

    public abstract void init(); 

} 
+1

Teşekkürler! Birden fazla çerçevem ​​yok ama bu sorunun ne olduğunu anlamama yardımcı oldu. Tüm ManagedBeans'im bir BaseController'ı genişletiyor. Bu BaseController, diğer ManagedBeans 'PostConstruct init() 'tarafından geçersiz kılacağını düşündüğüm bir' @PostConstruct init() 'yöntemine sahiptir. Görünüşe göre her ikisi de init() denir. Her şey şimdi mantıklı ... Teşekkür ederim! – Ionut

+0

'BaseController' sınıfında' @ PostConstruct 'olmamalıdır. Onu kaldır. – BalusC

+0

@BalusC: Küçük bir sorum var. Aynı fasulyede JSF ve CDI kullanımı ile ilgili olarak, @ @ ManagedBean'a bir CDI çekirdeği enjekte etmek için 'Inject 'kullanırsam,' @ PostConstruct 'yöntemi iki kez çağrılır mı? Aynı fasulyede birden fazla çerçevenin nasıl uygulanacağından emin değilim. Çerçevenin, fasulyeye @ ManagedBean, @ Aded, vb. Ile açıklanmasıyla karar verildiğini düşünmüştüm. –

3

o init() yöntemi ve @PostConstruct yöntemleri hem ateşleme ve bu davranışı neden olduğunu mümkündür. init() yönteminin adını değiştirmeyi ve/veya private'u koymayı deneyin. Ben de burada JSF yaşam döngüleri hata ayıklama hakkında iyi yazı bulundu

http://javahowto.blogspot.com/2011/07/servlet-init-method-vs-postconstruct.html

: Bu e-postanın sorunlarına ilgili olabileceğini düşünmek Aynı yöneten birden çerçeveler varsa gerçekleşebilir Debug JSF lifecycle

+1

Bu hiç mantıklı değil. Bir JSF yönetilen fasulye bir "HttpServlet" uygulaması değildir. – BalusC

+0

Yapılandırmaya bağlı olarak sistemin her iki yöntemde de karışmasına ve yanmasına neden olabilir. Belki de uzun bir atış oldu. Açıklaman için teşekkürler. – MrKiane

+0

Ek açıklamayı kaldırmayı denedim ancak init() öğesi göz ardı edildi. BalusC'nin yönetilen bir fasülyede init() yönteminin olmadığı göründüğü gibi. – Ionut

İlgili konular