35

我正在创建我的第一个项目 Java EE 7,但我遇到了麻烦。感谢任何帮助。

  • 雄猫 7.0.34
  • JSF 2.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

索引MB

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

索引.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>

面孔-config.xml

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

这些主题对我没有帮助:

4

2 回答 2

76

Tomcat 作为准系统 JSP/Servlet 容器不支持开箱即用的 CDI。您究竟是如何安装 CDI 的?你是真的放弃jakartaee-api.jar还是只是javaee-api.jar为了/WEB-INF/lib让你的代码编译?哦,请不要,这不是正确的方法。JEE API JAR 仅包含 API 类,不包含具体实现。摆脱整个 JAR。它可能会导致许多其他可移植性问题,例如此答案中描述的问题:如何在我的 Eclipse 项目中导入 javax.servlet / jakarta.servlet API?您实际上应该安装具体的实现以及特定的 API。

您有 2 个选项:

  1. 放弃 Tomcat 并选择真正的 Jakarta EE 容器。当您使用 Tomcat 时,只需转到TomEE 即可。非常简单,下载 TomEE Web 配置文件 zip 文件,将其解压缩并集成到 Eclipse 中,就像您为 Tomcat 所做的那样。不要忘记从 webapp 中删除 Jakarta EE JAR 文件并将项目属性中的Targeted Runtime属性从 Tomcat 更改为 TomEE,以便正确解决 Jakarta EE 依赖项。另请参阅Java EE 到底是什么?

    不需要额外的 JAR 或配置。您甚至可以从您的 web 应用程序中删除手动安装的 JSF/JSTL/CDI/BV/JPA/EJB/JTA/JSONPJAX-RS/etc/etc 库。作为真正的 Jakarta EE 容器,TomEE 已经为它们提供了开箱即用的功能。如果您使用的是 Maven,则以下坐标就足够了。

     <dependency>
         <groupId>jakarta.platform</groupId>
         <artifactId>jakarta.jakartaee-web-api</artifactId>
         <version><!-- e.g. 9.0.0 --></version>
         <scope>provided</scope>
     </dependency>
    

    provided请注意“目标运行时已经开箱即用”的重要性及其含义。有关Tomcat 和普通 JEE 容器的详细示例,另请参阅Tomcat 将 servlet 转换为 javax.servlet.Servlet 而不是 jakarta.servlet.http.HttpServlet 。pom.xml


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

    1. weld-servlet-shaded.jarwebapp 中的/WEB-INF/lib. 如果您使用的是 Maven,请使用此坐标

       <dependency>
           <groupId>org.jboss.weld.servlet</groupId>
           <artifactId>weld-servlet-shaded</artifactId>
           <version>4.0.0.Final</version>
       </dependency>
      
    2. 在 webapp 中创建/META-INF/context.xml具有以下内容的文件:

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

      请注意,当您使用 Mojarra 2.2.11 或更高版本时,此步骤不是绝对必要的,因为它可以ServletContext在 JNDI 中不存在时通过它找到它。

    3. /WEB-INF/beans.xml在 webapp 中创建一个文件。它可以保持为空。

    就是这样(注意:在较旧的 Weld Servlet 版本中,您还需要显式注册 CDI bean 管理器和 Weld 侦听器web.xml,但在当前版本中这是不必要的)。

    如果您更喜欢 Weld 之上的 OpenWebBeans 作为 CDI 实现,或者需要在 Tomcat 9.x 或更早版本中安装 CDI,请访问此博客以获取详细的 Maven 安装说明:如何在 Tomcat 中安装 CDI?


与具体问题无关,Tomcat 7 的 JSP/Servlet API符合 Java EE 7 的那些 API,而是符合 Java EE 6 (Servlet 3.0 / JSP 2.2)。如果您想要与 Java EE 7 (Servlet 3.1 / JSP 2.3) 等效的 Tomcat,那么您应该查看 Tomcat 8。另请参阅Apache Tomcat 版本矩阵

于 2013-09-25T11:31:43.753 回答
0

其他可能的选择是留beans.xml在您的部署中。

于 2014-06-03T12:27:50.833 回答