java.lang.NoSuchMethodError: com.google.common.collect.FluentIterable.toList () Lcom / google / common / collect / ImmutableList;

8

Ich verwende die Google Guava-Bibliothek für Aufgaben wie das Sortieren und Filtern von java.util.List<T> in einer Java EE 7-Anwendung.

Nachstehend ein Beispiel für die Filterung von java.util.List<T> basierend auf einer Liste von Filtern in einer CDI-Bean.

%Vor%

Die geschachtelte Klasse kann verwendet werden, um ein java.util.List<T> aus der CDI-Bean wie folgt zu filtern.

%Vor%

Dabei ist filters eine java.util.Map<String, Object> , die eine Filterliste enthält.

Dies funktionierte zuvor in einer Java EE-Anwendung mit JSF Managed Beans (auf GlassFish 4.0).

Ich habe diese Anwendung auf GlassFish 4.1 mit CDI Managed Beans migriert und die folgende Ausnahme ist aufgetreten.

%Vor%

Ich verwende Guava 17.0 für beide Anwendungen (doppelt überprüft).

Warum lehnt Guava CDI-Bohnen ab? Was könnte die Lösung / Problemumgehung sein?

UPDATE:

Ich habe versucht, die Version auf 18.0 zu ändern, aber es ist nichts Neues passiert.

    
Tiny 20.10.2014, 22:44
quelle

2 Antworten

9

Sie haben mehrere Versionen von Guava auf Ihrem Klassenpfad. NoSuchMethodError in einer Guava-Klasse kommt hier auf SO vielleicht einmal pro Woche. Der Wechsel zu einer neueren Version wird nicht helfen, solange Sie den alten nicht loswerden. Drucken Sie den Speicherort von FluentIterable.class aus und entfernen Sie diese JAR.

Wie Frank Pavageau bemerkt hat, kann dieser Ort als

erhalten werden %Vor%     
maaartinus 21.10.2014, 07:42
quelle
5

Dies ist ein bekanntes GlassFish-Problem. Mit GlassFish 4.1 und keinen anderen Änderungen wird Guava 13.0.1 verwendet. Wenn Sie Funktionen verwenden, die in dieser Version nicht vorhanden sind, erhalten Sie Fehler wie die von Ihnen angegebene. In meinem Fall war es java.lang.IncompatibleClassChangeError: Implementing class .

In den Kommentaren des Fehlerberichts wird empfohlen, glassfish/modules/guava.jar zu ersetzen. Dies scheint die einfachste Lösung zu sein. Ein anderer Ansatz besteht darin, einen benutzerdefinierten Klassenlader zu verwenden.

Bearbeiten: Wenn Sie <class-loader delegate="false"/> zu Ihrem glassfish-web.xml hinzufügen, wird Guava aus dem WAR geladen.

    
Martin 02.06.2015 12:51
quelle