设置当前线程上下文类加载器

时间:2015-07-06 15:33:03

标签: jsf jpa jsf-2

我在GlassFish 4.1,Mojarra 2.2.7,PrimeFaces 5.2上。我试图在JSF动作中动态启动JPA实体管理器。实体管理器需要加载JPA实体类才能执行查询。我在运行时创建并构建了JPA JAR,所以我尝试将它添加到当前线程中的类加载器中:

File jpaJar = getMyJpaJarFile();
ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
URLClassLoader urlClassLoader = new URLClassLoader(
  new URL[]{jpaJar.toURI().toURL()}
, currentThreadClassLoader
);
Thread.currentThread().setContextClassLoader(urlClassLoader);

这使我能够执行JPQL查询,但它让我进入这个JSF混乱:

Severe:   Unable to obtain InjectionProvider from init time FacesContext. Does this container implement the Mojarra Injection SPI?
Severe:   Application was not properly initialized at startup, could not find Factory: javax.faces.component.visit.VisitContextFactory. Attempting to find backup.
Severe:   Error Rendering View[/my.xhtml]
java.lang.IllegalStateException: Could not find backup for factory javax.faces.component.visit.VisitContextFactory. 
  at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:1135)
  at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:379)
  at javax.faces.component.visit.VisitContext.createVisitContext(VisitContext.java:219)
  at com.sun.faces.application.view.FaceletPartialStateManagementStrategy.saveView(FaceletPartialStateManagementStrategy.java:468)
  at com.sun.faces.application.StateManagerImpl.saveView(StateManagerImpl.java:89)
  at javax.faces.application.StateManager.getViewState(StateManager.java:593)
  at com.sun.faces.context.PartialViewContextImpl.renderState(PartialViewContextImpl.java:483)
  at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:325)
  at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:60)
  at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219)
  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)

如何在不破坏JSF的情况下修改类加载器,或解决此问题?

1 个答案:

答案 0 :(得分:1)

我重现了它,当我将GlassFish捆绑的Mojarra 2.2.7升级到当前可用的2.2.11(只需替换javax.faces.jar文件夹中的/modules)时,问题就消失了。事实证明,根据issue 3341 "Mojarra not resilient to ThreadContextClassLoader replacement",它已在Mojarra 2.2.9中得到承认和修复。

相关问题