2010-08-18 15 views
6
yılında @SessionScoped JSF2 fasulyesi

[GÜNCELLEME içine @Stateless EJB enjeksiyon: GlassFish forumlarında tartışma sonrasında/ML http://forums.java.net/jive/thread.jspa?messageID=480532 bir hata GlassFish https://glassfish.dev.java.net/issues/show_bug.cgi?id=13040 karşı açılmıştı Bu sorun için."EJB için ejbRef Dönüştürülemiyor" (Kaynak) GlassFish

JSF2 @Named @ javax.enterprise.context.SessionScoped desteğinin içine @Stateless EJB'nin yerel bir arabirim dışı görünümü enjekte etmeye çalışıyorum. EJB, soyut bir jenerik taban sınıfını genişleten birkaç kişiden biridir. "@Inject TheEJBClass varName" enjeksiyonu, "eJb TheEJBClass için, class sınıfındaki bir iş nesnesine my.package.name.TheAbstractBase için ejbRef dönüştürülemez" ile başarısız olur. [. Edit: Aslında, enjeksiyon başarılı çıkıyor ama süper sınıf miras yöntemleri için enjekte vekaleten yöntem çözünürlüğü başarısız] ben "@EJB TheEJBClass varName" kullanırsanız o zaman varName şey enjekte edilir, yani boş kalır.

Detayları:

Ben (bu konularda durumda Ubuntu 10,04) Linux GlassFish'in 3.0.1 çalıştıran ve CDI modelleri kapsamlı benim JSF2 oturumuna benim veri modeli EJB'ler enjeksiyonunu ele gerçek sorunlar yaşıyorum (Kaynak) . Ve evet, sormadan önce, ben beans.xml yerinde var ve CDI enjeksiyon gerçekleştirmek için aktif hale getiriyor. Bir @EJB ek açıklamasıyla enjekte ederse

, örneğin:

@EJB TheEJBClass memberName; 

... EJB aslında MemberName null adlı bırakarak enjekte edilmez. Bir CDI @ Enjekte ek açıklamasıyla enjekte ederse

: Ben TheEJBClass bir üst sınıfta uygulanan ve TheEJBClass geçersiz değil "MemberName" yöntemini çağırdığınızda

@Inject TheEJBClass memberName; 

... sonra CDI şikayet onun raporlama öz: Ben beton sınıfı ve bunu de-generifying için tabanını dönüştürme çalıştı, ama aynı sorunla karşılaşırsanız, bu nedenle ettik

java.lang.IllegalStateException: Unable to convert ejbRef for ejb TheEJBClass to a business object of type class my.package.name.TheAbstractBase 
    at 
com.sun.ejb.containers.EjbContainerServicesImpl.getBusinessObject(EjbContainerServicesImpl.java:104) 
at 
org.glassfish.weld.ejb.SessionObjectReferenceImpl.getBusinessObject(SessionObjectReferenceImpl.java:60) 
.... 

(Ben jenerik üsleri ile Weld böcek isabet sanmıyorum https://jira.jboss.org/browse/WELD-305, https://jira.jboss.org/browse/WELD-381, https://jira.jboss.org/browse/WELD-518).

netlik için eklenen ek açıklamalar tam paket yeterlilik ile koda ilişkin bir taslak,: Ben eğer TheEJBClass içinde TheAbstractBase.getValue() geçersiz kılmak veya eğer enjeksiyon çalışır olduğunu

// JSF2 managed backing bean. 
// 
// Called via #{someJSF2Model.value} in a JSF2 page 
// 
@javax.inject.Named 
@javax.enterprise.context.SessionScoped 
public class SomeJSF2Model implements Serializable { 
    @javax.inject.Inject TheEJBClass member; 

    public Integer getValue() { 
     return member.getValue(); 
    } 
    // blah blah 
} 

// One of several EJB classes that extend TheAbstractBase 
@javax.ejb.Stateless 
public class TheEJBClass extends TheAbstractBase { 
    // blah blah 
    // does **NOT** override "getValue()" 
} 

public abstract class TheAbstractBase { 
    // blah blah 
    public Integer getValue() { 
     return 1; 
    } 
} 

Not TheEJBClass'da tanımlanan ve herhangi bir üst sınıfta tanımlanmayan bir yöntemi çağırın. Mesele miras ile ilgili bir şey gibi görünüyor.

JSF2'nin yerleşik yaşam döngüsü ve enjeksiyon özellikleri kullanılan çok benzer kodlar işe yaradı, ancak bunun yeni bir proje olduğunu ve CDI'nın gelecekte bir yere gittiği göz önüne alındığında, CDI için gitmeyi denemenin en iyi yolu olduğunu düşündüm. Şu anda birlikte bir arada test dava oluşturuyor üzerinde çalışıyorum

// JSF2 managed backing bean. Using @ManagedBean and JSF2's @SessionScoped 
// instead of CDI @Named and CDI @SessionScoped this time. 
// 
@javax.faces.bean.ManagedBean 
@javax.faces.bean.SessionScoped 
public class SomeJSF2Model implements Serializable { 
    @javax.ejb.EJB TheEJBClass member; 
    public Integer getValue() { 
     return member.getValue(); 
    } 
    // blah blah 
} 

// One of several EJB classes that extend TheAbstractBase 
// Unchanged from CDI version 
@javax.ejb.Stateless 
public class TheEJBClass extends TheAbstractBase { 
    // blah blah 
    // does **NOT** override "getValue()" 
} 

// Unchanged from CDI version 
public abstract class TheAbstractBase { 
    // blah blah 
    public Integer getValue() { 
     return 1; 
    } 
} 

ama durum bu şimdi soruyu ateşlemesi düşündüm: İşte çalıştı JSF2/EJB enjeksiyonu, kullanmaya başlamıştım zaten sadece aptalca bir şey yapıyorum ya da Google-fu'mın bulmak için uygun olmadığı bilinen bir çözüm var. Neden JSF2/EJB enjeksiyonu ile çalışıyor, ancak CDI enjeksiyonu ile başarısız oldu?

(yeniden yayınlanmıştır http://forums.java.net/jive/thread.jspa?threadID=152567 olarak GlassFish forumlarda yana)

+0

Bu sorunu gösteren bir test vakası hazırladım. CDI tarafından oluşturulan JavaAssist sarmalayıcısının üst sınıflarda tanımlanan yöntemlere ilişkin referanslarını nasıl çözdüğü görünmektedir. Sorun aslında enjeksiyon zamanında değil, ancak bir süper sınıftan miras alınan bir yöntem enjekte edilen sargı yoluyla çağrılmaktadır. JSF2 veya CDI adlandırma ve kapsamının kullanımı bununla bir ilgisi yoktur, sadece @EJB vs @Inject Bkz. Http://www.postnewspapers.com.au/~craig/public_files_keep/ ErrorDemo.zip (src) ve http://www.postnewspapers.com.au/~craig/public_files_keep/ErrorDemo.war (webapp). –

+0

... ve bonus acı için, sorun JBoss AS 6'da oldukça tersine döndü. CDI enjeksiyonu iyi çalışıyor, ancak JSF2 enjeksiyonu başarısız oluyor. 2010 yılında sabit –

cevap

3

Yukarıda belirtildiği gibi, bir Kaynak/glassfish böcek.

Düzeltme: Glassfish'lerden vazgeç ve çoğu zaman gerçekten işe yarayan JBoss AS 7'ye geç.

+2

, https://java.net/jira/browse/GLASSFISH-13040 – ymajoros

İlgili konular