2016-05-03 15 views
0

Wir portieren derzeit unsere JEE 6-Anwendung (WAR-Implementierung) von GF 3.1 nach Payara 4.1.1. Wir verwenden EJBs und CDI-Beans. Sie sind in verschiedenen JAR-Dateien gepackt. Ich stehe vor dem Problem, dass die CDI-Beans, die sich in einer anderen JAR-Datei befinden, nicht gefunden werden können. Jede JAR-Datei hat ihre eigene META-INF/beans.xml und es gibt auch eine für das WAR-Archiv (WEB-INF/beans.xml). Ich habe bereits versucht, die folgenden Schritte:Laden von CDI-Beans in verschiedene JARs mit Payara 4.1.1

  • nehmen beans.xml (bean-Discovery-mode = "all")
  • die WAR-Innenseite und EAR-Bereitstellung bereitstellen.
  • geänderten Anmerkungen, die mit CDI 1.1
  • aktualisiert alle Bibliotheken auf die neueste Version (Richfaces, Guave, Eclipselink, ...) verändert die JEE 7 Anforderungen

Weiß jemand zu treffen, wenn es allgemein ist Fehler in Glassfish/Payara 4.1.1?

Thx, Bernd

Leider, die nicht helfen. Ich habe weitere Untersuchungen durchgeführt und es scheint, als ob nur "einige" Beans nicht korrekt vom BeanManager injiziert oder abgerufen werden können. Hier wird die Klassenhierarchie, die nicht funktioniert:

`// AllwaysFalse is our own annotation. 
@AllwaysFalse 
@Named 
public class AllwaysFalseRemoteCondition<E extends IStandardEntity> 
     extends ConditionBase<javax.persistence.criteria.Predicate, E> 
     implements RemoteCondition<javax.persistence.criteria.Predicate, E>  
{ 
… 
} 

// The abstract base class 
public abstract class ConditionBase<R, T extends IStandardEntity> implements  Condition<R, T> { 
} 

// The base interface 
public interface RemoteCondition<T, E extends IStandardEntity> extends Condition<T, E> { 

}

public interface Condition<T, E extends IStandardEntity> extends Part<ConditionDescriptor> { 
… 
} 

Wenn ich die Klasse oben zu ändern:

public class AllwaysFalseRemoteBotCondition<E extends IStandardEntity> { 
} 

Die Injektionsarbeiten.

Wenn ich versuche, die Bohnen über den BeanManager der getBeans() Methode funktioniert nicht, zu injizieren, wenn ich eine Art Basis-Suche:

`BeanManager bm = getBeanManager(); 
    Set<Bean<?>> beans = bm.getBeans(clazz, annotations); 

Wenn ich die Interface-Klasse in der „Klasse“ die Parameter zur Verfügung stellen Rückgabewert ist immer Null.

+0

Es gibt keinen Fehler, den ich kenne. Erhalten Sie irgendwelche Fehlermeldungen in der server.log? Es würde helfen, diese zu sehen. Welche Version von Payara benutzt du? Das Versionsschema sind die letzten 2 Ziffern des Jahres + Quartalsnummer. Die neueste Version ist 161.1 (162 wird in den nächsten Tagen erscheinen) – Mike

Antwort

0

Lösung:

Set<Bean<?>> beans = bm.getBeans(
    new TypeLiteral<RemoteCondition<javax.persistence.criteria.Predicate,?>>() {} 
    .getType(), 
    new AnnotationLiteral<AlwaysFalse>(){} 

Die TypeLiteral das Problem gelöst! Danke an Payara!

0

Laden Sie weld-servlet.jar herunter und legen Sie sie in die Bibliothek Ihres Projekts, oder besser, warum verwenden Sie nicht wildfly? Er trägt alle Gläser, um cdi in Ihrer Anwendung zu führen.

+0

Leider hat das nicht geholfen. Ich habe weitere Untersuchungen durchgeführt und es scheint, als ob nur "einige" Beans nicht korrekt vom BeanManager injiziert oder abgerufen werden können. Hier die Klassenhierarchie, die nicht funktioniert: –