2011-04-14 25 views
10

Fasulyeime bir hizmet enjekte etmeye çalışıyorum ama her zaman null. Aşağıdaki hatayı alıyorum: WELD-001000 Özellik userBean'ı temel boş değere karşı hata giderme."@ject" -ed özniteliği sıfırdır

Bazı kod parçacıkları:

index.xhtml

<h:body> 
    Hello from Facelets 
    #{userBean.name} 
</h:body> 

userbean.java

package beans; 

import Domain.User; 
import java.io.Serializable; 
import javax.enterprise.context.SessionScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 
import service.UserService; 

@Named 
@SessionScoped 
public class UserBean implements Serializable{ 
    @Inject UserService service; 
    private User user; 

    public UserBean(){ 
     this.user = service.find_user("foo"); 
    } 

    public String getName(){ 
     return "bar"; 
    } 
} 

UserService.java

package service; 

import Domain.User; 
import javax.ejb.Stateless; 
import javax.inject.Named; 

@Named 
@Stateless 
public class UserService { 
    public UserService(){} 

    public User find_user(String name){ 
     return new User(); 
    } 
} 

cevap

6

hata mesajı JVM UserBean bir örneğini oluşturmak mümkün olmadığını, bir ipucu olabilir. Aşağıdaki bazı tahmin ve kanıtlanmış gerekecekti:

Bağımlılığı Enjeksiyon bir bağımlılık enjektörü, bir UserBean içine UserService ait bir örneğini enjekte eden bir araç gerektirmez. Kodunuzda, bu enjekte edilen örneği, fasülyenin somutlaştırılması sırasında zaten kullanıyorsunuz: enjekte edilen hizmeti yapıcıya çağırırsınız.

ise bağımlılık enjektör o zaman bir NullPointerException (service hala o anda null olduğu için) yükseltecektir kurucu içinde hizmete çağrı fasulye oluşturulduktan sonra iş , var başlatır. Bir an için UserBean yapıcısında NPE'leri yakalamaya çalışarak bunu kontrol etmeye değer. voilà - - Bir yakalarsak bağımlılık enjektör biz


Geçici çözüm fikri (= yapıcı olarak) sınıf işlem yaptığı sırada enjekte hizmetlerini kullanamaz, bunun sonucu olarak, fasulye oluşturulduktan sonra runnning başlar ve: iç sınıf işe yarayabilir - küçük servis sağlayıcı yardımcı sınıf uygulamak:

public class UserBean implements Serializable { 
    static class UserServiceProvider { 
     @Inject static UserService service; 
    } 

    // ... 

    public UserBean() { 
     this.user = UserServiceProvider.service.findUser("kaas"); 
    } 

    // ... 
} 

Untested ama işe yarayabilir - hizmet fasulye yapıcı kullanmak önce sağlayıcı sınıfında enjekte edilmelidir.

+0

, nasıl düzeltebilirim ki? – martijnve

+1

@Martijn v E - bir çözüm hakkında düşündüm, son düzenlemeye bakın :) –

+4

@Martijn v E, belirtime göre bağımlılık enjeksiyonu yapılıyor. – Laures

6

Başka bir alternatif @PostConstruct yöntemi ek açıklamasını kullanmaktadır.

@SessionScoped 
public class UserBean implements Serializable { 
    @Inject UserService service; 
    private User user; 
    public UserBean() { 

    } 

    @PostConstruct 
    void init(){ 
     this.user = service.findUser("kaas"); 
    } 

    } 

Oku docs böyle görünüyor

İlgili konular