java.lang.NoSuchMethodError: com.google.commun.collecter.FluentIterable.toList()de l'icom/google/common/collect/ImmutableList;
Je suis en utilisant Google Goyave bibliothèque pour des tâches telles que le tri et le filtrage d'un java.util.List<T>
dans une Java EE 7.
Donné ci-dessous un exemple de filtrage d'un java.util.List<T>
basé sur une liste de filtres dans un bean CDI.
@Named
@ViewScoped
public class Bean extends LazyDataModel<T> implements Serializable {
private static final long serialVersionUID = 1L;
private final class Filtering implements Predicate<T> {
private final Map<String, Object> filters;
public Filtering(Map<String, Object> filters) {
this.filters = filters;
}
@Override
public boolean apply(T p) {
if (p == null) {
return false;
}
Integer id = (Integer) filters.get("id");
if (id != null && !p.getId().equals(id)) {
return false;
}
BigDecimal size = (BigDecimal) filters.get("size");
if (size != null && ((p.getSize().compareTo(size) < 0))) {
return false;
}
return true;
}
}
}
La classe imbriquée peut être utilisé pour filtrer un java.util.List<T>
de l'intérieur de la CDI bean comme suit.
List<T> list = //Initialize the list here to be filtered.
//...
list = FluentIterable.from(list).filter((new Filtering(filters))).toList();
Où filters
est un java.util.Map<String, Object>
la tenue d'une liste de filtres.
Cela fonctionnait bien auparavant, dans une application Java EE avec JSF Géré Haricots (sur GlassFish 4.0).
J'ai migré cette application GlassFish 4.1 avec CDI Géré Haricots et de l'exception suivante s'est produite.
SEVERE: java.lang.NoSuchMethodError: com.google.common.collect.FluentIterable.toList()Lcom/google/common/collect/ImmutableList;
at util.mesurements.custom.beans.BackNeckDepthManagedBean.load(BackNeckDepthManagedBean.java:184)
at org.primefaces.component.datatable.DataTable.loadLazyData(DataTable.java:838)
at org.primefaces.component.datatable.feature.FilterFeature.encode(FilterFeature.java:102)
at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:78)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:582)
at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
at org.primefaces.component.api.UIData.visitTree(UIData.java:692)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIForm.visitTree(UIForm.java:371)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:403)
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:322)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219)
at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:60)
at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:1004)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:430)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at filter.NoCacheFilter.doFilter(NoCacheFilter.java:28)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:722)
Je suis en utilisant la Goyave de 17,0 à la fois sur les applications (double vérification).
Pourquoi ne Goyave aversion CDI haricots. Quelle pourrait être la solution?
Mise à JOUR :
J'ai essayé de changer la version à 18,0 mais rien de nouveau ne s'est passé.
La bibliothèque est locale à la GUERRE. Il est stocké dans le
/WEB-INF/Lib
répertoire et ajouté au classpath (dans les deux applications avec JSF géré les haricots et l'autre avec le CDI haricots).
OriginalL'auteur Tiny | 2014-10-20
Vous devez vous connecter pour publier un commentaire.
Vous avez plusieurs versions de Goyave sur votre classpath.
NoSuchMethodError
dans une Goyave classe vient d'ici, DONC peut-être une fois par semaine. Le passage à une version plus récente n'aidera pas tant que vous n'avez pas à se débarrasser de l'ancien. Imprimer l'emplacement deFluentIterable.class
et de se débarrasser de ce POT.Comme Frank Pavageau commenté, cet emplacement peut être obtenu comme
FluentIterable.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm()
.Le double POT vient de Soudure/GlassFish lui-même. vous aurez besoin de revenir à 16 et le marquer comme prévu (ne pas le bundle). Toutefois, ce n'est probablement un problème de régression w/ GF 4.1 comme il semble comme chargeur de classe d'isolement a mieux fonctionné en 4.0
Une autre façon de voir les emplacements de classe avec GlassFish est d'ajouter
-verbose:class
pour le serveur de configuration des options JVM (peut être fait à l'aide de l'interface d'administration ou de la modification de ladomain.xml
; il y a probablement unasadmin
commande, trop) et de lancer le serveur avecasadmin start-domain --verbose
.si vous utilisez Gradle il pourrait être plus utile d'obtenir de la dépendance idées ./gradlew :app:dependencyInsight --configuration de compilation --la dépendance de goyave Pour avoir une idée jar personne à charge à partir de vieux goyave
OriginalL'auteur maaartinus
C'est un GlassFish question. Avec GlassFish 4.1 et pas d'autres modifications, Goyave 13.0.1 est utilisé ainsi, lorsque vous utilisez les fonctionnalités non présentes dans cette version, vous obtiendrez des erreurs comme celle que vous avez indiqué. Dans mon cas, c'était
java.lang.IncompatibleClassChangeError: Implementing class
.Dans les commentaires de la rapport de bug il est proposé de remplacer
glassfish/modules/guava.jar
. Cela semble être la solution la plus simple. Une autre approche est d'utiliser un chargeur de classe.Edit: Si vous ajoutez
<class-loader delegate="false"/>
à votreglassfish-web.xml
, puis la Goyave est chargé de la GUERRE.OriginalL'auteur Martin