【问题标题】:MyFaces CODI - add to projectMyFaces CODI - 添加到项目
【发布时间】:2012-11-11 01:28:28
【问题描述】:

我正在开发一个 maven JSF Web 应用程序。 我想在一些 @ViewScoped bean 上使用 @PreDestroy,但是这在 JSF 2.0 中是不可能的(或者在页面关闭或重定向时不可能) 我发现 MyFaces CODI 的 @ViewAccessScoped 可能是解决方案,但是我在添加它时遇到了问题。 当我尝试这个时:

<dependency>
    <groupId>org.apache.myfaces.extensions.cdi.bundles</groupId>
    <artifactId>myfaces-extcdi-bundle-jsf20</artifactId>
    <version>1.0.5</version>
</dependency>

编译时出错。

没有依赖项目运行良好。

我附上错误日志:

com.sun.faces.config.ConfigurationException: Factory 'javax.faces.context.FacesContextFactory' was not configured properly.
    at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:329)
    at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:235)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:376)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:227)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:649)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:530)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1471)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:791)
    at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1436)
    at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:856)
    at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:353)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: javax.faces.FacesException: org.apache.myfaces.extensions.cdi.jsf2.impl.listener.request.CodiFacesContextFactory
    at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:712)
    at javax.faces.FactoryFinder.getImplementationInstance(FactoryFinder.java:574)
    at javax.faces.FactoryFinder.access$500(FactoryFinder.java:140)
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:1122)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:381)
    at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:327)
    ... 46 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:692)
    ... 51 more
Caused by: java.lang.NoClassDefFoundError: javax/enterprise/context/spi/Contextual
    at org.apache.myfaces.extensions.cdi.core.impl.util.ClassDeactivation.getClassDeactivator(ClassDeactivation.java:69)
    at org.apache.myfaces.extensions.cdi.core.impl.util.ClassDeactivation.isClassActivated(ClassDeactivation.java:50)
    at org.apache.myfaces.extensions.cdi.jsf2.impl.listener.request.CodiFacesContextFactory.isActivated(CodiFacesContextFactory.java:138)
    at org.apache.myfaces.extensions.cdi.jsf2.impl.listener.request.CodiFacesContextFactory.<init>(CodiFacesContextFactory.java:46)
    ... 56 more
Caused by: java.lang.ClassNotFoundException: javax.enterprise.context.spi.Contextual
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
    ... 60 more

【问题讨论】:

  • CODI 是 CDI 扩展,因此它首先需要 CDI。例外也恰恰说明了这一点。类路径中缺少一个 CDI 类。 CDI 通常已经在 J​​ava EE 应用程序服务器中提供。但是,您的堆栈跟踪暗示您正在使用 Tomcat,这是一个准系统 JSP/Servlet 容器,不附带 CDI(更不用说 JSF 本身)。您还需要将 CDI 添加到 Tomcat 以解决此问题(因为我不是 Maven 人,我不知道该怎么做,因此这里没有我的回答)。另一种方法是升级到真正的 Java EE 应用服务器,例如 TomEE 或 Glassfish。
  • 您可以使用原型查看配置 CDI 实现所需的内容。请参阅myfaces.apache.org 并在页面上搜索“原型”或查看 CODI 附带的小示例之一或cwiki.apache.org/confluence/display/EXTCDI/External 中列出的示例。
  • 感谢您的回复,但是我无法解决问题,我仍然有错误,没关系:-(

标签: java maven jsf-2 myfaces codi


【解决方案1】:

当我在 JSF 中使用 Spring 时,我正在使用一个巴西框架,该框架使用 myfaces Orchestra 范围作为 Spring 新范围的背景:

  • "SameViewed" -> 就像@ViewScope (JSF)
  • "AccessScoped" -> 与 ViewAccessScoped 一样

这是一个非常好的图书馆,我没有更多的问题 在我的项目中使用范围。

抱歉,这是葡萄牙语,但如果显示有委托书,我可以翻译或帮助您入门... 葡萄牙语教程的链接:

http://lindbergframework.blogspot.com/2012/02/como-manter-o-estado-de-um-managedbean.html

希望这会有所帮助! :)

【讨论】:

  • MyFaces Orchestra 是 Spring 的附加组件,就像 CODI 是 CDI 一样。如果您的 Spring 配置有问题,Orchestra 就无法正常工作。如果您不将 CDI 添加到您的应用程序,CODI 将无法正常工作。这不应该是一个大惊喜......搜索 javax.enterprise.context.spi.Contextual 的来源应该不是那么困难;)我们在许多大型项目中使用 CODI 已有 2 年了,没有任何问题。跨度>
猜你喜欢
  • 2014-01-29
  • 2013-06-08
  • 1970-01-01
  • 2012-01-16
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 2013-04-23
相关资源
最近更新 更多