作为OSGi包的JSF Web应用程序 - 获取错误FacesContextFactory未正确配置

时间:2016-09-06 09:52:24

标签: jsf primefaces glassfish osgi wab

我试图将我的JSF应用程序转换为OSGi Bundle(WAB),但是当我将war文件部署到glassfish / autodeploy / bundles时,我一直收到以下错误,我并不是真的确定这意味着什么。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "forbidden",
    "message": "Forbidden"
   }
  ],
  "code": 403,
  "message": "Forbidden"
 }
}

我的[#|2016-09-06T11:35:05.402+0200|SEVERE|glassfish3.1.2|org.apache.catalina.core.ContainerBase|_ThreadID=61;_ThreadName=pool-5-thread-1;|ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: Factory 'javax.faces.context.FacesContextFactory' was not configured properly. at org.apache.catalina.core.StandardContext.start(StandardContext.java:5389) at com.sun.enterprise.web.WebModule.start(WebModule.java:498) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:917) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:901) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:733) at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2018) at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1669) at com.sun.enterprise.web.WebApplication.start(WebApplication.java:109) at org.glassfish.internal.data.EngineRef.start(EngineRef.java:130) at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:269) at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:301) at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461) at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) at org.glassfish.osgijavaeebase.OSGiDeploymentRequest.deploy(OSGiDeploymentRequest.java:183) at org.glassfish.osgijavaeebase.OSGiDeploymentRequest.execute(OSGiDeploymentRequest.java:118) at org.glassfish.osgijavaeebase.AbstractOSGiDeployer.deploy(AbstractOSGiDeployer.java:121) at org.glassfish.osgijavaeebase.OSGiContainer.deploy(OSGiContainer.java:154) at org.glassfish.osgijavaeebase.JavaEEExtender.deploy(JavaEEExtender.java:107) at org.glassfish.osgijavaeebase.JavaEEExtender.access$200(JavaEEExtender.java:61) at org.glassfish.osgijavaeebase.JavaEEExtender$HybridBundleTrackerCustomizer$1.call(JavaEEExtender.java:151) at org.glassfish.osgijavaeebase.JavaEEExtender$HybridBundleTrackerCustomizer$1.call(JavaEEExtender.java:148) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: Factory 'javax.faces.context.FacesContextFactory' was not configured properly. at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:292) at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:4750) at com.sun.enterprise.web.WebModule.contextListenerStart(WebModule.java:550) at org.apache.catalina.core.StandardContext.start(StandardContext.java:5366) ... 24 more Caused by: com.sun.faces.config.ConfigurationException: Factory 'javax.faces.context.FacesContextFactory' was not configured properly. at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:305) at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:219) at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:360) at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:225) ... 27 more Caused by: javax.faces.FacesException: com.sun.faces.context.InjectionFacesContextFactory at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:630) at javax.faces.FactoryFinder.getImplementationInstance(FactoryFinder.java:509) at javax.faces.FactoryFinder.access$400(FactoryFinder.java:139) at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:993) at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:343) at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:303) ... 30 more Caused by: java.lang.IllegalArgumentException: argument type mismatch 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:526) at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:623) ... 35 more |#] 文件的结构如下:

war

我的testWab.war | - img/ - META-INF/ | - MANIFEST.MF - WEB-INF/ | - classes/ | - lib/ | - primefaces-5.3.jar | - javax.servlet.jsp-api-2.2.1.jar | - and other jar files | - web.xml | - faces-config.xml | - web.xml | - glassfish-web.xml - views/ | - all *.xhtml 看起来像这样:

web.xml

我的<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Production</param-value> </context-param> <context-param> <param-name>primefaces.FONT_AWESOME</param-name> <param-value>true</param-value> </context-param> <welcome-file-list> <welcome-file>faces/index.xhtml</welcome-file> </welcome-file-list> <!-- Servlet Config --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> </web-app> 看起来像这样:

glassfish-web.xml

我的<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> <glassfish-web-app error-url=""> <context-root>/testWAB</context-root> <class-loader delegate="false"/> <property name="useBundledJsf" value="true"/> </glassfish-web-app> 是这样的:

MANIFEST.MF

1 个答案:

答案 0 :(得分:1)

行。经过大量的拔毛和键盘敲击后,我终于让这些框架一起工作了。

此处供您参考。

<小时/>  框架版本:

  • Glassfish 3.1.2
  • Primefaces 5.3.0
  • OSGi 1.3.0
  1. Primefaces jar不应该在WAR的WEB-INF/lib文件夹中。它应该部署为OSGi Bundle。这就像将jar放入glassfish/autodeploy/bundles目录一样简单。

  2. 将以下资源文件和目录从Primefaces jar的META-INF复制到您的网络套件中:primefaces-p.taglib.xmlfaces-config.xmlresources。< / p>

  3. 我的论坛已经拥有了自己的faces-config.xml,因此我重命名了Primefaces primefaces-config.xml中的那个,并将其放在我的捆绑WEB-INF下。然后我将以下内容添加到web.xml以使用这两个文件:

    <context-param>
      <param-name>javax.faces.CONFIG_FILES</param-name>
      <param-value>
          /WEB-INF/faces-config.xml,
          /WEB-INF/primefaces-config.xml
      </param-value>
    </context-param>
    
    1. 最后,我的WAB具有以下结构:

      testWab.war

      • IMG /
      • resources /(来自Primefaces jar)
      • META-INF /

        • MANIFEST.MF

        • primefaces-p.taglib.xml(来自Primefaces jar)

      • WEB-INF /

        • 类/

        • LIB /

          • 一些jar文件EXCLUDE primefaces jar
        • 的web.xml

        • 面-config.xml中

        • primefaces-config.xml中

        • 的web.xml

        • 的glassfish-web.xml中

      • 视图/

        • all * .xhtml
    2. 小故障?

      1. 你的Primefaces版本可能不喜欢Glassfish附带的jsf版本。我建议你抵制包含你自己的jsf jar的冲动并告诉Glassfish useBundledJsf。我试过了。浪费了无数个小时,没有任何效果。
      2. 理想情况下,您可以将框架升级到任何版本,以便它们能够很好地协同工作,但在我的情况下,不允许这样做,这就是我所做的。

        我有JSF 2.1附带的Glassfish 3.1.2,它不能与Primefaces 5.3一起使用。 我将原glassfish\modules\javax.faces.jar替换为javax.faces-2.2.jar

        我的glassfish-web.xml看起来像这样:

        <glassfish-web-app error-url="">
            <context-root>/testWAB</context-root>
            <class-loader delegate="true" />
        </glassfish-web-app>
        
        1. 您的WAB突然无法找到任何Java面孔类。
        2. 确保捆绑类路径正确,javax.faces.*下列出了Import-Package

          我的MANIFEST.MF看起来像这样:

          Manifest-Verion: 1.0
          Bundle-ManifestVersion: 2
          Bundle-SymbolicName: testWAB
          Bundle-Version: 0.1.0.SNAPSHOT
          Bundle-Name: Simulation Vis
          Import-Package: javax.faces;version="2.2.0",
           javax.faces.application;version="2.2.0",
           javax.faces.bean,
           javax.faces.component;version="2.2.0",
           javax.faces.context;version="2.2.0",
           javax.faces.event;version="2.2.0",
           javax.servlet,
           javax.servlet.http,
           javax.ws.rs,
           javax.ws.rs.core,
           org.osgi.framework;version="1.3.0"
          Bundle-ClassPath: WEB-INF/classes,
           WEB-INF/lib/jar1.jar,
           WEB-INF/lib/jar2.jar
          Web-ContextPath: /testWAB
          Bundle-RequiredExecutionEnvironment: JavaSE-1.7
          Bundle-Activator: test.Activator
          Require-Bundle: myBundle1;bundle-version="0.1.0";visibility:=reexport,
           myBundle1;bundle-version="0.1.0";visibility:=reexport,
           org.primefaces;bundle-version="5.3.0"
          Bundle-Vendor: Me