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

I use the Google Guava library for tasks such as sorting and filtering java.util.List<T> in a Java EE 7 application.

The following is an example of filtering java.util.List<T> based on the list of filters in the CDI bean.

 @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; } } } 

A nested class can be used to filter java.util.List<T> inside a CDI bean as follows.

 List<T> list = //Initialize the list here to be filtered. //... list = FluentIterable.from(list).filter((new Filtering(filters))).toList(); 

Where filters is java.util.Map<String, Object> containing a list of filters.


This worked fine in a Java EE application with JSF Managed Beans (on GlassFish 4.0).

I ported this app to GlassFish 4.1 with CDI-managed Beans , and the following exception occurred.

 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) 

I use Guava 17.0 for both applications (tested it twice).

Why Guava doesn't like CDI beans. What could be the solution / workaround?


UPDATE:

I tried changing the version to 18.0, but nothing new happened.

+10
java-ee guava glassfish
source share
2 answers

You have several versions of Guava in your class path. NoSuchMethodError in the Guava class comes here on SO, maybe once a week. Switching to a newer version will not help if you do not get rid of the old one. Print the location of FluentIterable.class and get rid of this JAR.

As Frank Pavageu noted, this location can be obtained as

 FluentIterable.class.getProtectionDomain().getCodeSource().getLocation().toExte‌​rnalForm() 
+12
source share

This is a known GlassFish issue. In GlassFish 4.1 and without other modifications, Guava 13.0.1 is used, so when using functions that are not in this version, you will get errors similar to the one you specified. In my case, it was java.lang.IncompatibleClassChangeError: Implementing class .

The comments on the error message suggest replacing glassfish/modules/guava.jar . This seems to be the easiest solution. Another approach is to use a custom class loader.

Edit: If you add <class-loader delegate="false"/> to glassfish-web.xml , then Guava is loaded from WAR.

+6
source share

All Articles