2016-05-03 16 views
0

Ich bin gerade dabei, einen EJB und einen ManagedBean in einen Spring-Handler zu injizieren. Mein Ziel ist es, diese zwei Bohnen in diese AuthenticationSuccessHandler zu injizieren.Inject EJB und CDI in Spring-Handler

Dieser Handler wird von Spring bei erfolgreicher Anmeldung aufgerufen und scheint keine Injection-Annotations zu verarbeiten. Die beiden Bohnen, die injiziert werden soll, sind die folgende Struktur:

@javax.ejb.Stateless 
public class EjbService { 
} 

@javax.enterprise.context.SessionScoped 
@javax.inject.Named("cdiBean") 
public class CdiBean implements Serializable { 
} 

Bisher habe ich verschiedene Anmerkungen wie die folgenden versucht, aber die Variablen bleiben null:

public class LoginAuthenticationSuccessHandler implements AuthenticationSuccessHandler { 

    @EJB 
    private UserDatabaseService userDatabaseService; 

    @Inject 
    private UserManagementBean userManagement; 
} 

Könnte jemand Punkt ich auf den richtigen Weg?

+0

Wie Sie die 'LoginAuthenticationSuccessHandler' erstellen. –

+0

Via XML: '' –

+0

Und es gibt '' oder ''. Ohne eine davon sind die Anmerkungen ziemlich nutzlos. –

Antwort

1

Normalerweise können Sie CDI Managed Bean nicht in Spring Managed Bean injizieren. Sie müssen direkten Zugriff auf Bean Manager verwenden. Zum Beispiel mit der Klasse javax.enterprise.inject.spi.CDI.

dann kann man so etwas tun:

public static <T> T getInstance(Class<T> type, Annotation... qualifiers) { 
    Set<Bean<?>> beans = getBeanManager().getBeans(type, qualifiers); 
    Bean<?> bean = getBeanManager().resolve(beans); 

    if(bean == null){ 
     throw new UnsatisfiedResolutionException(); 
    } 

    @SuppressWarnings("unchecked") 
    T instance = (T) getBeanManager().getReference(bean, type, 
      getBeanManager().createCreationalContext(bean)); 
    return instance; 
} 

public static BeanManager getBeanManager() { 
    return CDI.current().getBeanManager(); 
} 
+0

So hat es funktioniert, danke! –