无法在 servlet 容器中将 bean 与 jsf 2.3 一起使用

Unable to use beans with jsf 2.3 in servlet container

不久前我开始测试 JSF 2.3。但是我无法使用最重要的功能之一。 ManagedBean 的使用。我尝试了很多,使用不同的 servlet 容器(Tomcat 8&9,Jetty 9.2)。但没有任何帮助。希望有人能看到我在资源方面的失败。真令人沮丧。我调试了,但从未到达 bean。 primefaces 组件工作正常(primefaces 库不是原因)。但我从来没有得到豆数据。 PS。我正在使用 myfaces,但使用 mojarra 我遇到了同样的问题。

我的豆子:

import javax.enterprise.context.RequestScoped;
import javax.faces.annotation.FacesConfig;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import java.io.Serializable;

@Named(value = "sampleBean")
@RequestScoped
@FacesConfig(version = FacesConfig.Version.JSF_2_3)
public class SampleBean implements Serializable {
    private String specTitle;
    private String specVersion;
    private String implTitle;
    private String implVersion;


    public SampleBean() {
        Package facesPackage = FacesContext.class.getPackage();
        specVersion = facesPackage.getSpecificationVersion();
        specTitle = facesPackage.getSpecificationTitle();
        implTitle = facesPackage.getImplementationTitle();
        implVersion = facesPackage.getImplementationVersion();
    }

    public String info() {
        return "hello from sampleBean!";
    }

    public String getSpecTitle() {
        return specTitle;
    }

    public String getSpecVersion() {
        return specVersion;
    }

    public String getImplTitle() {
        return implTitle;
    }

    public String getImplVersion() {
        return implVersion;
    }

}

我的配置bean:

import javax.faces.annotation.FacesConfig;

@FacesConfig(version = FacesConfig.Version.JSF_2_3)
public class ConfigurationBean {
}

我的小脸:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>Hello JSF 2.3</title>
    <style>
        .col-1 { text-align: right; }
        .col-2 { font-weight: bold; }
    </style>
</h:head>
<h:body>

<div style="border-style: dashed" class="ui-g">
<p:calendar mode="inline"/>
</div>
<div style="border-style: double">
<h3>Hello from JSF 2.3!</h3>

<h:panelGrid columns="2" columnClasses="col-1, col-2">

    <h:outputText value="Specification:"/>
    <h:outputText value="#{sampleBean.specTitle}"/>

    <h:outputText value="Specification version:"/>
    <h:outputText value="#{sampleBean.specVersion}"/>

    <h:outputText value="Implementation:"/>
    <h:outputText value="#{sampleBean.implTitle}"/>

    <h:outputText value="Implementation version:"/>
    <h:outputText value="#{sampleBean.implVersion}"/>
</h:panelGrid>

<p>CDI injection support: <b>#{sampleBean.facesContextValue}</b></p>
<p>Running on: <b>#{application.serverInfo}</b></p>
</div>

我的web.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1"><!-- Use web-app_4_0.xsd, version=4.0 after update to Java EE 8 -->

    <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>

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.ENABLE_CDI_RESOLVER_CHAIN</param-name>
        <param-value>truet</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.ENABLE_WEBSOCKET_ENDPOINT</param-name>
        <param-value>true</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.validator.ENABLE_VALIDATE_WHOLE_BEAN</param-name>
        <param-value>true</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
        <param-value>0</param-value> <!-- No Cache  -->
    </context-param>

    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>

</web-app>

我的build.gradle:

plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}

group 'de.danri'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
}

gretty{
    //servletContainer="tomcat8"
    //servletContainer="tomcat9"
}

dependencies {
    // https://mvnrepository.com/artifact/org.apache.myfaces.core/myfaces-impl
    compile group: 'org.apache.myfaces.core', name: 'myfaces-impl', version: '2.3.1'
    // https://mvnrepository.com/artifact/org.apache.myfaces.core/myfaces-api
    compile group: 'org.apache.myfaces.core', name: 'myfaces-api', version: '2.3.1'
    // https://mvnrepository.com/artifact/org.primefaces/primefaces
    compile group: 'org.primefaces', name: 'primefaces', version: '6.2'
    // https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api
    compile group: 'javax.servlet.jsp', name: 'jsp-api', version: '2.2.1-b03'
    // https://mvnrepository.com/artifact/javax.enterprise/cdi-api
    compile group: 'javax.enterprise', name: 'cdi-api', version: '2.0.SP1'
    // https://mvnrepository.com/artifact/javax.websocket/javax.websocket-api
    compile group: 'javax.websocket', name: 'javax.websocket-api', version: '1.1'
    // https://mvnrepository.com/artifact/javax.servlet/jstl
    compile group: 'javax.servlet', name: 'jstl', version: '1.2'
    // https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api
    compile group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1'
    // https://mvnrepository.com/artifact/javax.validation/validation-api
    compile group: 'javax.validation', name: 'validation-api', version: '2.0.1.Final'

    testCompile group: 'junit', name: 'junit', version: '4.12'
}

beans.xml:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.1" bean-discovery-mode="all">
</beans>

面孔-config.xml:

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.3"
              xmlns="http://xmlns.jcp.org/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd">
</faces-config>

谢谢你娘。好地址!解决方案: 我添加了 /META-INF/context.xml

<Context>
    <Resource name="BeanManager"
              auth="Container"
              type="javax.enterprise.inject.spi.BeanManager"
              factory="org.jboss.weld.resources.ManagerObjectFactory" />
</Context>

我将 weld-servlet shaded 添加到我的依赖项中:

...
compile group: 'org.jboss.weld.servlet', name: 'weld-servlet-shaded', version: '3.0.5.Final'
...

最后我使用本地 tomcat 来 运行 神器而不是 gradle 'gretty' 插件。 看来插件的cdi有问题。