当前位置: 首页 > 知识库问答 >
问题:

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

黄信厚
2023-03-14

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

  • 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"
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>
  • Java EE 6@javax.annotation.managedBean vs@javax.inject.named vs@javax.faces.managedBean
  • 目标不可达标识符解析为NULL
  • 目标不可达,标识符解析为NULL
  • javax.el.PropertyNotFoundException:目标不可达,标识符“login”解析为null Spring+JSF
  • http://www.andrejkoelewijn.com/blog/2010/03/05/jee-cdi-tip-target-unreachable-identifier-resolved-to-null/

共有1个答案

欧阳飞
2023-03-14

Tomcat作为一个准JSP/servlet容器,不支持CDI。您到底是如何安装CDI的?您真的在/WEB-INF/lib中删除jakartaee-api.jarjavaee-api.jar只是为了编译代码吗?哦,请不要,这不是正确的方式。JEE API JAR只包含API类,而不包含具体的实现。把整个罐子处理掉。它可能会导致许多其他的可移植性问题,比如下面的答案中描述的问题:如何在我的Eclipse项目中导入javax.servlet/jakarta.servlet API?您实际上应该安装具体的实现和特定的API。

您有两种选择:

>

  • 放下Tomcat,寻找真正的Jakarta EE容器。在使用Tomcat时,只需转到Tomee。它非常简单,下载TomEE web profile zip文件,提取它并将其集成到Eclipse中,就像您为Tomcat所做的那样。不要忘记从webapp中删除Jakarta EE JAR文件,并将Project属性中的目标运行时属性从Tomcat改为TomEE,以便正确地解决Jakarta EE依赖关系。另请参见Java EE到底是什么?

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

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

    >

  • 删除WebApp的/WEB-INF/lib中的weld-servlet-shaded.jar。如果您使用的是Maven,请使用以下坐标:

     <dependency>
         <groupId>org.jboss.weld.servlet</groupId>
         <artifactId>weld-servlet-shaded</artifactId>
         <version>4.0.0.Final</version>
     </dependency>
    

    在webapp中创建/meta-inf/context.xml文件,其内容如下:

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

  •  类似资料:
    • 本文向大家介绍如何在Ubuntu 16.04上安装和使用Docker,包括了如何在Ubuntu 16.04上安装和使用Docker的使用技巧和注意事项,需要的朋友参考一下 Docker是一个开源项目,可以自动在软件容器内部署应用程序。该容器允许开发人员打包所有项目资源,例如库,依赖项,资产等。Docker用Go编程语言编写,由Dotcloud开发。它基本上是一个容器引擎,使用诸如命名空间和控制组之

    • 我正在使用谷歌可乐笔记本进行一个项目,该项目要求我在地图上绘制全球定位系统坐标。我想为此使用底图。我试图通过使用 将其导入Colab笔记本,结果显示以下错误: 我需要安装basemap模块才能使用它。我试过,并尝试在Colab上运行它,但没有成功。

    • 我正在寻找安装Tomcat。所以,我解压缩了文件,将CATALINA_HOME设置为我在命令行上看到的路径名(在我的机器上),我的setenv.bat如下所示: 我也试过了 只是 然而,当我调用启动时。bat,我一直收到这样的错误:“JRE_HOME环境变量定义不正确……”。 那里的路径名是我的Windows/系统环境变量的PATH变量上的一个。JRE和JDK已经在这台机器上运行了几个月——它们安

    • 本文向大家介绍如何在centos 7上安装和使用docker和容器,包括了如何在centos 7上安装和使用docker和容器的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将学习如何安装Docker。Dockers是一个非常好的工具,可以在自己的容器上运行应用程序。它像虚拟机一样工作,具有更高的可移植性和资源友好性,并且更加依赖于主机OS。有两种在CentOS 7上安装Docker的方法

    • 问题内容: 我需要能够在Python 2和3之间来回切换。如何使用Homebrew做到这一点,因为我不想弄乱路径并遇到麻烦。现在,我通过Homebrew安装了2.7。 问题答案: 我会用pyenv您可以安装它: 要在您的Bash shell中启用pyenv,您需要运行: 要在启动时自动为Bash执行此操作,请将该行添加到您的中。1个 用法: 安装并激活pyenv后,您可以安装不同版本的python

    • 问题内容: 错误信息: 配置: Ubuntu 14.10(GNU / Linux 3.16.0-23-通用x86_64) gcc(Ubuntu 4.9.1-16ubuntu6)4.9.1 红宝石2.1.2p95(2014-05-08)[x86_64-linux-gnu] 问题答案: 使用RVM在Ubuntu 14.04上升级到Rails 4.2.4之后,我需要这样做: 要么 完整的堆栈跟踪:htt