最后,我按照here的说明在Spring Boot环境中成功引导了Weld。对于使用Mojarra的JSF和使用Jersey的Web服务,CDI都没有问题。
但是现在我在我的应用程序中尝试包含Omnifaces 2.6时遇到了一个问题。
我的应用程序启动失败并显示以下消息:
com.sun.faces.config.ConfigurationException: Factory 'javax.faces.lifecycle.ClientWindowFactory' was not configured properly.
at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:330) ~[javax.faces-2.2.14.jar:2.2.14]
at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:236) ~[javax.faces-2.2.14.jar:2.2.14]
at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:439) ~[javax.faces-2.2.14.jar:2.2.14]
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:227) ~[javax.faces-2.2.14.jar:2.2.14]
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4743) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5207) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419) [tomcat-embed-core-8.5.20.jar:8.5.20]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409) [tomcat-embed-core-8.5.20.jar:8.5.20]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_141]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_141]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_141]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_141]
Caused by: javax.faces.FacesException: com.sun.faces.lifecycle.ClientWindowFactoryImpl
at javax.faces.FactoryFinderInstance.getImplGivenPreviousImpl(FactoryFinderInstance.java:407) ~[javax.faces-2.2.14.jar:2.2.14]
at javax.faces.FactoryFinderInstance.getImplementationInstance(FactoryFinderInstance.java:251) ~[javax.faces-2.2.14.jar:2.2.14]
at javax.faces.FactoryFinderInstance.getFactory(FactoryFinderInstance.java:543) ~[javax.faces-2.2.14.jar:2.2.14]
at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:283) ~[javax.faces-2.2.14.jar:2.2.14]
at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:328) ~[javax.faces-2.2.14.jar:2.2.14]
... 12 common frames omitted
Caused by: java.lang.IllegalStateException: Singleton not set for STATIC_INSTANCE => []
at org.jboss.weld.bootstrap.api.helpers.RegistrySingletonProvider$RegistrySingleton.get(RegistrySingletonProvider.java:28) ~[weld-servlet-shaded-3.0.2.Final.jar:3.0.2.Final]
at org.jboss.weld.Container.instance(Container.java:53) ~[weld-servlet-shaded-3.0.2.Final.jar:3.0.2.Final]
at org.jboss.weld.SimpleCDI.<init>(SimpleCDI.java:77) ~[weld-servlet-shaded-3.0.2.Final.jar:3.0.2.Final]
at org.jboss.weld.environment.WeldProvider$EnvironmentCDI.<init>(WeldProvider.java:45) ~[weld-servlet-shaded-3.0.2.Final.jar:3.0.2.Final]
at org.jboss.weld.environment.WeldProvider.getCDI(WeldProvider.java:61) ~[weld-servlet-shaded-3.0.2.Final.jar:3.0.2.Final]
at javax.enterprise.inject.spi.CDI.lambda$getCDIProvider$0(CDI.java:87) ~[weld-servlet-shaded-3.0.2.Final.jar:3.0.2.Final]
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174) ~[na:1.8.0_141]
at java.util.TreeMap$KeySpliterator.tryAdvance(TreeMap.java:2770) ~[na:1.8.0_141]
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126) ~[na:1.8.0_141]
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498) ~[na:1.8.0_141]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485) ~[na:1.8.0_141]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_141]
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152) ~[na:1.8.0_141]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_141]
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464) ~[na:1.8.0_141]
at javax.enterprise.inject.spi.CDI.getCDIProvider(CDI.java:88) ~[weld-servlet-shaded-3.0.2.Final.jar:3.0.2.Final]
at javax.enterprise.inject.spi.CDI.current(CDI.java:64) ~[weld-servlet-shaded-3.0.2.Final.jar:3.0.2.Final]
at org.omnifaces.util.Beans.getManager(Beans.java:87) ~[omnifaces-2.6.8.jar:2.6.8]
at org.omnifaces.util.Beans.getReference(Beans.java:115) ~[omnifaces-2.6.8.jar:2.6.8]
at org.omnifaces.application.OmniApplication.<init>(OmniApplication.java:66) ~[omnifaces-2.6.8.jar:2.6.8]
at org.omnifaces.application.OmniApplicationFactory.createOmniApplication(OmniApplicationFactory.java:86) ~[omnifaces-2.6.8.jar:2.6.8]
at org.omnifaces.application.OmniApplicationFactory.getApplication(OmniApplicationFactory.java:51) ~[omnifaces-2.6.8.jar:2.6.8]
at com.sun.faces.application.InjectionApplicationFactory.getApplication(InjectionApplicationFactory.java:93) ~[javax.faces-2.2.14.jar:2.2.14]
at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:142) ~[javax.faces-2.2.14.jar:2.2.14]
at com.sun.faces.lifecycle.ClientWindowFactoryImpl.<init>(ClientWindowFactoryImpl.java:62) ~[javax.faces-2.2.14.jar:2.2.14]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_141]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_141]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_141]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_141]
at java.lang.Class.newInstance(Class.java:442) ~[na:1.8.0_141]
at javax.faces.FactoryFinderInstance.getImplGivenPreviousImpl(FactoryFinderInstance.java:405) ~[javax.faces-2.2.14.jar:2.2.14]
... 16 common frames omitted
POM是:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Beca</groupId>
<artifactId>EscolaSpringBoot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Escola jsf-primefaces-spring-boot</name>
<description>JSF - PrimeFaces Example using Spring Boot and Maven</description>
<url>https://www.codenotfound.com/jsf-primefaces-example-spring-boot-maven.html</url>
<parent>
<groupId>org.joinfaces</groupId>
<artifactId>jsf-spring-boot-parent</artifactId>
<version>2.4.1</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<jersey.version>2.26</jersey.version>
<hibernate.version>5.2.12.Final</hibernate.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.joinfaces</groupId>
<artifactId>jsf-spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet-shaded</artifactId>
<version>3.0.2.Final</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.omnifaces</groupId>
<artifactId>omnifaces</artifactId>
<version>2.6.8</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext.cdi</groupId>
<artifactId>jersey-cdi1x-servlet</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>${jersey.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- spring-boot-maven-plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
答案 0 :(得分:1)
如@BalusC所述,这是初始化顺序的问题。
我正在使用:
import org.jboss.weld.environment.servlet.Listener;
@SpringBootApplication
public class MyApplication
{
public static void main(String[] args)
{
SpringApplication.run(MyApplication.class, args);
}
@Bean
public Listener weldListener()
{
return new Listener();
}
}
因此它被初始化为在JSF初始化之后运行的servlet上下文侦听器。
我改变了我的代码:
@Bean
public ServletContextInitializer weldServletContextInitializer()
{
return new WeldServletContextInitializer();
}
而不是weldListener()
,而WeldServletContextInitializer
是:
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.jboss.weld.environment.servlet.EnhancedListener;
import org.springframework.boot.web.servlet.ServletContextInitializer;
public class WeldServletContextInitializer implements ServletContextInitializer
{
private ServletContainerInitializer servletContainerInitializer;
@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
ServletContainerInitializer servletContainerInitializer = getServletContainerInitializer();
servletContainerInitializer.onStartup(null, servletContext);
}
private ServletContainerInitializer getServletContainerInitializer()
{
if (servletContainerInitializer == null)
servletContainerInitializer = new EnhancedListener();
return servletContainerInitializer;
}
}
现在Omnifaces 2.x开始没有问题。
修改强>:
需要通过org.omnifaces.ApplicationInitializer
初始化Omnifaces,它是在这个bean中完成的:
@Bean
public ServletContextInitializer omnifacesServletContextInitializer()
{
return new OmnifacesServletContextInitializer();
}
OmnifacesServletContextInitializer
的位置:
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.omnifaces.ApplicationInitializer;
import org.springframework.boot.web.servlet.ServletContextInitializer;
public class OmnifacesServletContextInitializer implements ServletContextInitializer
{
private ServletContainerInitializer servletContainerInitializer;
@Override
public void onStartup(ServletContext sc) throws ServletException
{
ServletContainerInitializer servletContainerInitializer = getServletContainerInitializer();
servletContainerInitializer.onStartup(null, sc);
}
private ServletContainerInitializer getServletContainerInitializer()
{
if (servletContainerInitializer == null)
servletContainerInitializer = new ApplicationInitializer();
return servletContainerInitializer;
}
}