2014-10-20 19 views
8

Tôi đang sử dụng thư viện Google Guava cho các tác vụ như sắp xếp và lọc java.util.List<T> trong ứng dụng Java EE 7.java.lang.NoSuchMethodError: com.google.common.collect.FluentIterable.toList() Lcom/google/common/collect/ImmutableList;

Đưa ra dưới đây một ví dụ về lọc java.util.List<T> dựa trên danh sách bộ lọc trong hạt 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; 
     } 
    } 
} 

Lớp lồng nhau có thể được sử dụng để lọc java.util.List<T> từ trong đĩa CDI như sau.

List<T> list = //Initialize the list here to be filtered. 

//... 

list = FluentIterable.from(list).filter((new Filtering(filters))).toList(); 

Trường hợp filtersjava.util.Map<String, Object> giữ danh sách bộ lọc.


này đã làm việc tốt trước đó trong một ứng dụng Java EE với JSF Managed Beans (trên GlassFish 4.0).

Tôi đã di chuyển ứng dụng này sang GlassFish 4.1 với Đậu được quản lý CDI và xảy ra ngoại lệ sau.

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) 

Tôi đang sử dụng Guava 17.0 trên cả hai ứng dụng (đã kiểm tra kỹ).

Tại sao khoai lang không thích hạt CDI. Giải pháp/giải pháp có thể là gì?


UPDATE:

tôi đã cố gắng thay đổi phiên bản 18.0 nhưng không có gì mới xảy ra.

+0

Bạn đang sử dụng thư viện cục bộ trong WAR của mình hay nó được triển khai tới máy chủ ứng dụng? –

+0

Thư viện là địa phương để WAR. Nó được lưu trữ trong thư mục '/ WEB-INF/Lib' và được thêm vào classpath (trong cả hai ứng dụng - một với JSF managed beans và một với bean CDI). – Tiny

Trả lời

9

Bạn có nhiều phiên bản của Ổi trên đường dẫn lớp của mình. NoSuchMethodError trong một lớp học ổi đến đây trên SO có thể một lần mỗi tuần. Chuyển sang phiên bản mới hơn sẽ không giúp bạn lâu dài không loại bỏ phiên bản cũ. In ra vị trí của FluentIterable.class và loại bỏ JAR đó.

Như Frank Pavageau nhận xét, vị trí này có thể thu được như

FluentIterable.class.getProtectionDomain().getCodeSource().getLocation().toExte‌​rnalForm() 
+4

Để hoàn thành câu trả lời, vị trí của lớp được lấy bằng 'FluentIterable.class.getProtectionDomain(). GetCodeSource(). GetLocation(). ToExternalForm()'. –

+0

JAR trùng lặp xuất phát từ chính Weld/GlassFish. bạn sẽ cần phải hạ cấp xuống 16 và đánh dấu nó là đã cung cấp (không gói nó). Tuy nhiên, đây có thể là vấn đề hồi quy w/GF 4.1 vì có vẻ như cách ly lớp học hoạt động tốt hơn trong 4.0 –

+0

Một cách khác để xem các vị trí lớp bằng GlassFish là thêm '-verbose: class' vào các tùy chọn JVM server-config (có thể thực hiện bằng cách sử dụng GUI quản trị hoặc chỉnh sửa 'domain.xml'; có thể cũng có lệnh' asadmin' và bắt đầu máy chủ với 'asadmin start-domain --verbose'. – Martin

5

Đây là một vấn đề GlassFish biết. Với GlassFish 4.1 và không có sửa đổi nào khác, Guava 13.0.1 được sử dụng nên khi bạn sử dụng các tính năng không có trong phiên bản đó, bạn sẽ gặp lỗi như phiên bản bạn đã nói. Trong trường hợp của tôi, nó là java.lang.IncompatibleClassChangeError: Implementing class.

Trong các ý kiến ​​của bug report, đề nghị thay thế glassfish/modules/guava.jar. Đây có vẻ là giải pháp dễ nhất. Một cách tiếp cận khác là sử dụng trình nạp lớp tùy chỉnh.

Chỉnh sửa: Nếu bạn thêm <class-loader delegate="false"/> vào glassfish-web.xml, thì Ổ đĩa được tải từ WAR.

+0

trong glassfish-web.xml đã giải quyết nó cho tôi. – JimGoods

Các vấn đề liên quan