Jsf 如何在Tomcat上安装和使用CDI?

Jsf 如何在Tomcat上安装和使用CDI?,jsf,tomcat,cdi,jsf-2.2,Jsf,Tomcat,Cdi,Jsf 2.2,我正在创建我的第一个项目JavaEE7,但我遇到了麻烦。谢谢你的帮助 Tomcat 7.0.34 JSF2.2 Primefaces 3.5 javaee-api-7.0.jar 应用程序启动时,Tomcat日志显示以下消息: "validateJarFile (C:\...\build\web\WEB-INF\lib\javaee-api-7.0.jar)-jar not loaded. See Servlet 2.3 Spec, section 9.7.2. Offending clas

我正在创建我的第一个项目JavaEE7,但我遇到了麻烦。谢谢你的帮助

  • Tomcat 7.0.34
  • JSF2.2
  • Primefaces 3.5
  • javaee-api-7.0.jar
应用程序启动时,Tomcat日志显示以下消息:

"validateJarFile (C:\...\build\web\WEB-INF\lib\javaee-api-7.0.jar)-jar not loaded. See Servlet 2.3 Spec, section 9.7.2. Offending class: javax/servlet/Servlet .class"
当我单击调用托管bean的按钮时,我得到错误:

Advertência: /index.xhtml @18,66 value="#{indexMB.user}": Target Unreachable, identifier 'indexMB' resolved to null
javax.el.PropertyNotFoundException: /index.xhtml @18,66 value="#{indexMB.user}": Target Unreachable, identifier 'indexMB' resolved to null
IndexMB

@Named("indexMB")
@RequestScoped
public class IndexMB {

private String password;
private String user;

public String loginTest(){
    return (this.user.equals("admin") ? "adminPage" : "inOutPage");
}

// getters and setters
}
index.xhtml

<html ...>

<f:loadBundle basename="i18n" var="bundle" />
<h:head>
    <title>#{bundle['index_title']}</title>
</h:head>
<h:body>
    #{bundle['index_appname']}
    <br />
    <h:form id="frmIndex">
        <p:panelGrid columns="2">
            <p:outputLabel for="user" value="#{bundle['lblUser']}" />
            <p:inputText id="user" value="#{indexMB.user}" />

            <p:outputLabel for="password" value="#{bundle['lblPassword']}" />
            <p:password id="password" value="#{indexMB.password}" />
        </p:panelGrid>
        <p:commandButton action="#{indexMB.loginTest}" value="#{bundle['btn_login']}" />
    </h:form> 
</h:body>
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
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_2.xsd">

<application>
    <locale-config>
        <default-locale>pt_BR</default-locale>
        <supported-locale>en</supported-locale>
        <supported-locale>fr</supported-locale>
    </locale-config>
</application>

#{bundle['index_title']}
#{bundle['index_appname']}

faces config.xml

<html ...>

<f:loadBundle basename="i18n" var="bundle" />
<h:head>
    <title>#{bundle['index_title']}</title>
</h:head>
<h:body>
    #{bundle['index_appname']}
    <br />
    <h:form id="frmIndex">
        <p:panelGrid columns="2">
            <p:outputLabel for="user" value="#{bundle['lblUser']}" />
            <p:inputText id="user" value="#{indexMB.user}" />

            <p:outputLabel for="password" value="#{bundle['lblPassword']}" />
            <p:password id="password" value="#{indexMB.password}" />
        </p:panelGrid>
        <p:commandButton action="#{indexMB.loginTest}" value="#{bundle['btn_login']}" />
    </h:form> 
</h:body>
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
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_2.xsd">

<application>
    <locale-config>
        <default-locale>pt_BR</default-locale>
        <supported-locale>en</supported-locale>
        <supported-locale>fr</supported-locale>
    </locale-config>
</application>



  • Tomcat作为一个简单的JSP/Servlet容器,不支持CDI开箱即用。您是如何安装CDI的?你真的把
    jakartaee-api.jar
    javaee-api.jar
    放在
    /WEB-INF/lib
    中只是为了让你的代码编译吗?哦,求你了,不,这不是正确的方法。JEE API JAR只包含API类,而不是具体的实现。把整个罐子扔掉。它可能会导致许多其他可移植性问题,如本答案中所述:您实际上应该安装具体的实现以及特定的API

    您有两种选择:

  • 放下Tomcat,选择一个真正的雅加达EE容器。当您使用Tomcat时,请转到。它非常简单,提取它并将其集成到Eclipse中,方法与您为Tomcat所做的完全相同。不要忘记从webapp中删除Jakarta EE JAR文件,并将项目属性中的目标运行时属性从Tomcat更改为TomEE,以便正确解决Jakarta EE依赖关系。另见

    不需要额外的jar或配置。您甚至可以从webapp中删除手动安装的JSF/JSTL/CDI/BV/JPA/EJB/JTA/JSONPJAX-RS/etc/etc库。作为一个真正的雅加达EE容器,TomEE已经为它们提供了全面的解决方案。如果您使用的是Maven,下面的坐标就足够了

    
    雅加达平台
    有关Tomcat和普通JEE容器的详细
    pom.xml
    示例


  • 在Tomcat上安装真正的CDI实现。下面的说明假设Tomcat 10+。是可用的CDI实现之一。在中,您可以找到如何将其集成到Tomcat中的说明。为了完整性和将来的参考,以下是步骤:

  • 在webapp的
    /WEB-INF/lib
    中删除。如果您正在使用Maven,请使用:

    
    org.jboss.weld.servlet
    



  • 与具体问题无关,Tomcat 7的JSP/Servlet API不符合Java EE 7的API,而是符合Java EE 6(Servlet 3.0/JSP 2.2)。如果您想要与JavaEE7(Servlet3.1/JSP2.3)等效的Tomcat,那么您应该看看Tomcat8。另请参见。

    Tomcat作为一个基本的JSP/Servlet容器,不支持现成的CDI。您是如何安装CDI的?你真的把
    jakartaee-api.jar
    javaee-api.jar
    放在
    /WEB-INF/lib
    中只是为了让你的代码编译吗?哦,求你了,不,这不是正确的方法。JEE API JAR只包含API类,而不是具体的实现。把整个罐子扔掉。它可能会导致许多其他可移植性问题,如本答案中所述:您实际上应该安装具体的实现以及特定的API

    您有两种选择:

  • 放下Tomcat,选择一个真正的雅加达EE容器。当您使用Tomcat时,请转到。它非常简单,提取它并将其集成到Eclipse中,方法与您为Tomcat所做的完全相同。不要忘记从webapp中删除Jakarta EE JAR文件,并将项目属性中的目标运行时属性从Tomcat更改为TomEE,以便正确解决Jakarta EE依赖关系。另见

    不需要额外的jar或配置。您甚至可以从webapp中删除手动安装的JSF/JSTL/CDI/BV/JPA/EJB/JTA/JSONPJAX-RS/etc/etc库。作为一个真正的雅加达EE容器,TomEE已经为它们提供了全面的解决方案。如果您使用的是Maven,下面的坐标就足够了

    
    雅加达平台
    有关Tomcat和普通JEE容器的详细
    pom.xml
    示例


  • 在Tomcat上安装真正的CDI实现。下面的说明假设Tomcat 10+。是可用的CDI实现之一。在中,您可以找到如何将其集成到Tomcat中的说明。为了完整性和将来的参考,以下是步骤:

  • 在webapp的
    /WEB-INF/lib
    中删除。如果您正在使用Maven,请使用:

    
    org.jboss.weld.servlet
    



  • 与具体问题无关,Tomcat 7的JSP/Servlet API不符合Java EE 7的API,而是符合Java EE 6(Servlet 3.0/JSP 2.2)。如果您想要与JavaEE7(Servlet3.1/JSP2.3)等效的Tomcat,那么您应该看看Tomcat8。另请参见。

    其他可能的选项是在部署中保留
    beans.xml

    其他可能的选项是在部署中保留
    beans.xml

    显示您的
    faces config.xml
    fileThank's@Kalathoki,文件已添加。几乎什么都没有,因为我正在使用注释。确保
    indexMB
    bean构建成功。显示
    faces config.xml
    fileThank的@Kalathoki,文件已添加。几乎什么都没有,因为我正在使用注释。请确保
    indexMB
    bean构建成功。正如我所说,“这是我的第一个JavaEE7项目”。非常感谢。我切换到TomEE,但初始化它会显示以下错误:
    com.sun.faces.config.ConfigurationException:Factory'javax.faces.application.Appli