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

7rfyedvj  于 2022-12-04  发布在  其他
关注(0)|答案(2)|浏览(205)

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

  • 雄猫7.0.34
  • JSF 2.2版
  • 基本面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>

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

这些主题对我没有帮助:

0sgqnhkj

0sgqnhkj1#

Tomcat作为一个准框架JSP/Servlet容器,不支持现成的CDI。将jakartaee-api.jarjavaee-api.jar放到/WEB-INF/lib中只是为了让代码进行编译是不正确的。JEE API JAR只包含API类,而不是具体的实现。去掉整个JAR。它可能会导致许多其他的可移植性问题,就像本答案中描述的那样:如何在Eclipse项目中导入javax.servlet / jakarta. servletAPI?您实际上应该安装具体的实现沿着特定的API。
您有两个选项:
1.放弃Tomcat,使用真正的Jakarta EE容器。当您使用Tomcat时,只需转到TomEE。它非常简单,download the TomEE web profile zip file,提取它并将其集成到Eclipse中,方法与Tomcat完全相同。不要忘记从webapp中删除Jakarta EE JAR文件,并更改项目中的 Targeted Runtime 属性。的属性从Tomcat转换为TomEE,以便正确解析Jakarta EE依赖项。另请参见What exactly is 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. 10.0.0 or 9.1.0 --></version>
     <scope>provided</scope>
 </dependency>

请注意provided的重要性及其含义,如“目标运行时已经提供了此功能”。有关Tomcat和普通JEE容器的详细pom.xml示例,另请参见如何在Maven pom. xml中为Tomcat正确配置Jakarta EE库?。
1.如果你想坚持使用Tomcat,那么你需要通过webapp手动安装一个真正的CDI实现。下面的说明假设Tomcat 10+. Weld是可用的CDI实现之一。在the Weld installation guide中,你可以找到如何将它集成到Tomcat中的说明。为了完整和将来的参考,下面是步骤:
1.对于Tomcat 10.1.x,将weld-servlet-shaded.jar of version 5.x放到webapp的/WEB-INF/lib中。如果您使用的是Maven,请使用以下坐标:

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

对于Tomcat 10.x,请改用weld-servlet-shaded.jar of version 4.x

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

1.(可选)在webapp中创建包含以下内容的/META-INF/context.xml文件:

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

只有当依赖于CDI-dependent的库试图在JNDI中手动查找它时,才需要执行此步骤。例如,当您使用Jakarta Faces / JSF 2.3或更高版本时,就不需要执行此步骤。
1.在webapp中创建一个/WEB-INF/beans.xml文件来触发CDI的激活。它可以保持为空。
就这样了
如果您更喜欢使用OpenWebBeans而不是Weld作为CDI实现,或者需要在Tomcat 9.x或更早版本中安装CDI,请访问此博客以了解详细的Maven安装说明:How to install CDI in Tomcat?

vxf3dgd4

vxf3dgd42#

另一个可能的选择是在部署中保留beans.xml

相关问题