2011-04-14 17 views
10

Estoy tratando de inyectar un servicio en mi bean, pero siempre es null. Recibo el siguiente error: WELD-001000 Error al resolver la propiedad userBean contra base null."@inject" -ed atributo sigue siendo nulo

Algunos fragmentos de código:

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(); 
    } 
} 

Respuesta

6

El error mensaje podría ser una pista, que la JVM no fue capaz de crear una instancia de UserBean. El siguiente es un poco de adivinanzas y tendría que ser probada:

Dependecy inyección requiere un inyector de dependencia, una herramienta que inyecta una instancia de UserService en un UserBean. En su código, ya está utilizando esta instancia inyectada durante la creación de instancias del bean: llama al servicio inyectado en el constructor.

Si el inyector de dependencia comienza su trabajo después se crea el grano, a continuación, la llamada al servicio dentro del constructor levantará un NullPointerException (porque service sigue siendo null en ese momento). Vale la pena comprobarlo tratando de atrapar NPE en el constructor UserBean por un momento. Si descubre a uno - voilà - el inyector dependencia comienza runnning después del frijol ha sido creado y, como consecuencia, no podemos utilizar los servicios inyectados durante la instanciación de la clase (= en el constructor)


idea de la solución provisional: aplicar una pequeña clase de ayuda proveedor de servicios - clase interna podría funcionar:

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

    // ... 

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

    // ... 
} 

no probado, pero podría funcionar - el servicio se debe inyectar en la clase de proveedor de antes de que lo utilice en el constructor frijoles.

+0

Ese parece ser el caso, ¿cómo puedo solucionar esto? – martijnve

+1

@Martijn v E - pensé en una solución, ver mi última edición :) –

+4

@Martijn v E por inyección de dependencia de especificación ocurre DESPUÉS del constructor. – Laures

6

Otra alternativa es usar la anotación del método @PostConstruct.

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

    } 

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

    } 

Leer docs

Cuestiones relacionadas