2014-10-20 27 views
8

Bir Java EE 7 uygulamasında java.util.List<T>'un sınıflandırılması ve filtrelenmesi gibi görevler için Google Guava kitaplığını kullanıyorum. Bir CDI çekirdeğindeki filtrelerin bir listesini temel alan bir java.util.List<T> filtrelemenin bir örneği aşağıda verilmiştir. java.lang.NoSuchMethodError: com.google.common.collect.FluentIterable.toList() Lcom/google/common/collect/ImmutableList;

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

iç içe sınıf

aşağıdaki gibi CDI fasulye içinden bir java.util.List<T> filtre kullanılabilir. filters

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

//... 

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

filtre listesi tutan bir java.util.Map<String, Object> olduğunu.


Bu

MTU Yönetilen Fasulye (GlassFish 4.0 üzerine) ile bir Java EE uygulaması önceden iyi çalışıyordu.

Ben CDI Yönetilen Fasulye ve aşağıdaki durum oluştu ile 4.1 glassfish için bu uygulamayı göç etti.

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) 

Her iki uygulamada da Guava 17.0 kullanıyorum (iki kez kontrol ettim).

Guava neden CDI çekirdeklerini sevmez. Çözüm/çözüm ne olabilir?


GÜNCELLEME: Ben 18.0 ancak yeni bir şey oldu için sürüm değişen çalıştı

.

+0

WAR kütüphanenizde yerel kütüphane kullanıyor musunuz veya uygulama sunucusuna dağıtılmış mı? –

+0

Kütüphane, WAR için yereldir. '/ WEB-INF/Lib' dizininde saklanır ve sınıf yoluna eklenir (her iki uygulamada - biri JSF tarafından yönetilen fasulye ve diğeri CDI çekirdekleri ile). – Tiny

cevap

9

Sınıf yolunuzda Guava'nın birden çok sürümü var. Guava sınıfında NoSuchMethodError, belki de haftada bir kez SO üzerinde gelir. Daha yeni bir sürüme geçmek, eskisinden kurtulmadığınız sürece size yardımcı olmaz. FluentIterable.class'un konumunu yazdırın ve bu JAR'dan kurtulun.

Frank PAVAGEAU yorumladığı gibi

, bu konum

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

Yanıtı tamamlamak için, sınıfın yeri FluentIterable.class.getProtectionDomain(). GetCodeSource(). GetLocation(). ToExternalForm() 'ile elde edilir. –

+0

Yinelenen JAR, Weld/GlassFish'in kendisinden gelir. 16'ya düşürmeniz ve sağlanan şekilde işaretlemeniz gerekir (paketlemeyin). Ancak bu muhtemelen bir regresyon sorunu 4.0/ –

+0

daha iyi çalıştı classloader izolasyon daha iyi gibi görünüyor w/GF 4.1 olduğu gibi Glassfish ile sınıf yerleri görmek için bir başka yolu sunucu-config JVM seçenekleri eklemek için -verbose: class ' yönetici GUI kullanılarak ya da 'domain.xml 'dosyası kullanılarak yapılır, muhtemelen bir' asadmin' komutu da vardır ve sunucu 'asadmin start-domain --verbose' ile başlatılır. Glassfish-web.xml dosyasında – Martin

5

Bu bilinen bir GlassFish konudur olarak elde edilebilir. GlassFish 4.1 ile ve başka hiçbir değişiklik yapmadan Guava 13.0.1 kullanılır, bu nedenle bu sürümde bulunmayan özellikleri kullandığınızda, belirttiğiniz gibi hatalar elde edersiniz. Benim durumumda, java.lang.IncompatibleClassChangeError: Implementing class idi. bug report ait yorumlarında

o glassfish/modules/guava.jar yerine önerilir. Bu en kolay çözüm gibi görünüyor. Başka bir yaklaşım, özel bir sınıf yükleyici kullanmaktır.

Düzenleme: Eğer glassfish-web.xml için <class-loader delegate="false"/> eklerseniz sonra Guava SAVAŞ yüklenir.

+0

benim için çözdü. – JimGoods

İlgili konular