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

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

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

@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

}

<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?你真的降javaee-api.jar/WEB-

INF/lib只是为了让你的代码编译?哦,不,这不是正确的方法。Java EE API

JAR仅包含API类,而不包含具体实现。摆脱整个JAR。它可能会引起许多其他可移植性问题,例如此答案中描述的问题:如何在Eclipse项目中导入javax.servlet

API?实际上,您应该安装具体的实现以及特定的API。

您有2个选择:

  1. 删除Tomcat并使用真正的Java EE容器。在使用Tomcat时,只需转到TomEE即可。这非常简单,下载TomEE Web配置文件zip文件,解压缩并将其集成到Eclipse中,就像使用Tomcat一样。不要忘记从webapp中删除Java EE JAR文件,并将项目属性中的 Targeted Runtime 属性从Tomcat更改为TomEE,以便正确解决Java EE依赖性。

无需其他JAR或配置。您甚至可以从Web应用程序中删除JSF JAR。作为真正的Java

EE容器,TomEE已经提供了现成的JSF和CDI。如果您使用的是Maven,则下面的坐标就足够了。

    <dependency>

<groupId>javax</groupId>

<artifactId>javaee-web-api</artifactId>

<version><!-- 8.0 or 7.0 or 6.0 --></version>

<scope>provided</scope>

</dependency>

请注意的重要性provided及其含义,例如“目标运行时已提供了此功能”。


  1. 在Tomcat上安装真正的CDI实现。焊接是可用的CDI实现之一。在Weld安装指南中,您可以找到有关如何将其集成到Tomcat中的说明。为了完整性和将来的参考,以下是步骤:

    1. weld-servlet-shaded.jar放到webapp的中/WEB-INF/lib。如果您使用的是Maven,请使用以下坐标:

          <dependency>

      <groupId>org.jboss.weld.servlet</groupId>

      <artifactId>weld-servlet-shaded</artifactId>

      <version>3.1.4.Final</version>

    2. /META-INF/context.xml在Webapp中使用以下内容创建文件:

          <Context>

      <Resource name="BeanManager"

      auth="Container"

      type="javax.enterprise.inject.spi.BeanManager"

      factory="org.jboss.weld.resources.ManagerObjectFactory"/>

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

3. `/WEB-INF/beans.xml`在webapp中创建一个空文件。

就是这样(请注意:在较旧的Weld Servlet版本中,您也需要显式注册CDI

bean管理器和Weld侦听器web.xml,但这对于当前版本是不必要的)。

如果您更喜欢Weld之上的OpenWebBeans作为CDI实现,请转至此博客,以获取详细的Maven安装说明:如何在Tomcat中安装CDI?


具体问题 ,Tomcat 7的JSP / Servlet API 符合Java EE 7的那些API,而是符合JavaEE 6(Servlet 3.0 / JSP 2.2)。如果要使用与Java EE 7(Servlet 3.1 / JSP2.3)等效的Tomcat,则应查看Tomcat8。另请参见ApacheTomcat版本列表。

以上是 如何在Tomcat上安装和使用CDI? 的全部内容, 来源链接: utcz.com/qa/419805.html

回到顶部