2012-04-27 23 views
11

Tengo el siguiente código para administrar dos tipos de repositorios. Ambas clases de repositorio heredan una interfaz para permitir la reinicialización de sus recursos.Dependencias insatisfechas para el tipo [...] con calificadores [@Default] en el punto de inyección (utilizando @Blanco EJB con CDI)

public interface CachingRepository 
{ 
    public void invalidateCache(); 
} 

global, de ámbito de aplicación de recompra:

@Named("globalRepo") 
@ApplicationScoped 
public class GlobalRepository implements CachingRepository 
{ 
    private List<Category> categories; 

    ... 

    @Override 
    public void invalidateCache() 
    { 
     categories = null; 
    } 

    ... 
} 

por usuario, ámbito de sesión repo:

@Named("userRepo") 
@SessionScoped 
//@Stateful   // <- NOTE HERE 
public class UserRepository implements CachingRepository, Serializable 
{ 
    private List<MyFile> files; 

    @Override 
    public void invalidateCache() 
    { 
     files = null; 
    } 

    ... 
} 

Al inyectar este (sin @Stateful) en el contexto

@Named 
@ViewScoped 
public class MyHandler implements Serializable 
{ 
    @Inject 
    private UserRepository userRepo; 

    ... 
} 

funciona. Sin embargo, cuando se añade a la clase @StatefulUserRepository, el despliegue falla con un dicho excepción:

Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [UserRepository] with qualifiers [@Default] at injection point [[field] @Inject private de.company.project.pack.MyHandler.userRepo] 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:275) 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244) 
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107) 
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127) 
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346) 
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331) 
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366) 
    at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83) 
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:76) 
    ... 5 more 

Añadir el nombre del bean CDI como

@Inject @Named("userRepo") 
private UserRepository userRepo; 

resultados en la misma excepción. La única cosa que funciona en conjunción con @Stateful es utilizar la interfaz en la declaración var:

@Inject @Named("userRepo") 
private CachingRepository userRepo; 

que podría necesitar funcionalidad subclase aquí, sin embargo, por lo que usar CachingRepository no es realmente deseada (por el momento).

de Q:

  1. ¿Por qué no esta funcionando como se esperaba? La var UserRepository ya debería identificar qué clase instanciar, ¿no es así? ¿Cuál es la lógica de esto?
  2. ¿Por qué la anotación EJB @Stateful tiene efectos tan graves aquí? ¿Por qué básicamente me obliga a usar la interfaz CachingRepository en la declaración var?

Nota, I' Uso de la costura 3 caras que hacen la @ViewScoped convertido en un grano de vista de ámbito de CDI, por lo que el problema en cuestión es probable que todavía CDI sólo.

+0

Ah, y por cierto esto parece haber sido respondido hasta cierto punto antes aquí http://stackoverflow.com/questions/9038815/weld-001408-desatisfied-dependencies-when-injecting-ejbs-that-implement-interfac, pero ¿por qué "si usas un EJB ya no puedes usar la implementación"? ¿Cuál es la lógica detrás de esto? ¿Por qué ya no es posible? Esta convención parece existir, pero ¿por qué lo hace? – Kawu

+0

Mientras escribía, no veo ningún sentido al respecto y estoy contento de que ya no sea posible, así que no puedo evitarlo-) –

+0

¿Sabía que necesita '@ Named' si, y solo si lo necesita? Acceso JSF para un frijol administrado CDI? Todo lo que hace es proporcionar un nombre EL calificado, ** no ** hacer un pojo a un bean administrado CDI (que es 'hecho' por beans.xml) ... –

Respuesta

9

tuve el mismo problema con esta excepción engañosa ...

Mediante la adición de @Stateful a UserRepository se expone métodos EJB de la interfaz CachingRepository sin tener una vista sin interfaz declarado. Agregue @LocalBean a UserRepository para activar la vista sin interfaz. Ver especificación EJB 3.1, Sección 4.9.8 "No-Vista de la Interfaz de bean de sesión"

La clase bean debe designar que expone una vista sin interfaz a través de su definición de clase de frijoles o en el descriptor de despliegue.Las siguientes reglas se aplican:

  • ...
  • Si el bean expone al menos otro punto de vista del cliente, el frijol designa que expone una vista sin interfaz mediante el anotación en el @LocalBean clase de bean o en el descriptor de despliegue .
  • ...

También se refieren a this stackoverflow respuesta para obtener más información acerca de las vistas sin interfaz.

+0

¡Agradable, justo lo que necesitaba, gracias! – Kawu

+1

No tengo ningún EJB. Ni siquiera estoy usando ninguna anotación @Default en ninguna parte de mi código. Pero aún en el momento del inicio de Wildfly está arrojando esta excepción. He buscado mucho, pero todos hablan de EJB. – Sujoy

Cuestiones relacionadas