我正在创建我的第一个项目Java EE 7,但我遇到了麻烦。感谢任何帮助。
当应用程序启动时,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>
面-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>
这些主题对我没有帮助:
答案 0 :(得分:61)
Tomcat作为一个准系统JSP / Servlet容器不支持CDI开箱即用。你是怎么安装CDI的?您是否真的将javaee-api.jar
放入/WEB-INF/lib
只是为了让代码编译?哦,请不,这不是正确的方法。 Java EE API JAR仅包含API类,而不是具体实现。摆脱整个JAR。它可能导致许多其他可移植性问题,如本答案中所述:How do I import the javax.servlet API in my Eclipse project?您应该实际安装具体实现以及特定的API。
您有两个选择:
删除Tomcat并寻找真正的Java EE容器。当您使用Tomcat时,请转到TomEE。它非常简单,download the TomEE web profile zip file,提取它并将其集成到Eclipse中,与Tomcat完全相同。不要忘记从webapp中删除Java EE JAR文件,并将项目属性中的 Targeted Runtime 属性从Tomcat更改为TomEE,以便正确解析Java EE依赖项。
无需额外的JAR或配置。您甚至可以从webapp中删除JSF JAR。 TomEE作为一个真正的Java EE容器已经提供了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
的重要性及其含义,如“目标运行时已经提供了这个”。另请参阅How to properly install and configure JSF libraries via Maven?。
在Tomcat上安装真正的CDI实现。 Weld是可用的CDI实现之一。在the Weld installation guide中,您可以找到如何将其集成到Tomcat中的说明。为了完整性和未来参考,以下是步骤:
将weld-servlet-shaded.jar
放入webapp的/WEB-INF/lib
。如果您使用的是Maven,请使用this coordinate:
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet-shaded</artifactId>
<version>3.0.5.Final</version>
</dependency>
在webapp中创建/META-INF/context.xml
文件,其中包含以下内容:
<Context>
<Resource name="BeanManager"
auth="Container"
type="javax.enterprise.inject.spi.BeanManager"
factory="org.jboss.weld.resources.ManagerObjectFactory"/>
</Context>
请注意,当您使用Mojarra 2.2.11或更新版本时,此步骤并非绝对必要,因为当JNDI中不存在时,它将能够通过ServletContext
找到它。
在webapp中创建一个空的/WEB-INF/beans.xml
文件。
就是这样(注意:在较旧的Weld Servlet版本中,你需要在web.xml
中显式注册CDI bean管理器和Weld监听器,但这对当前版本来说是不必要的。)
如果您更喜欢将Weld上方的OpenWebBeans作为CDI实施,请访问此博客以获取详细的Maven安装说明:How to install CDI in Tomcat?
无关,Tomcat 7的JSP / Servlet API 不符合Java EE 7的API,而是符合Java EE 6(Servlet 3.0) / JSP 2.2)。如果你想要Tomcat等同于Java EE 7(Servlet 3.1 / JSP 2.3),那么你应该看看Tomcat 8.另见Apache Tomcat version matrix。
答案 1 :(得分:0)
其他可能的选择是在部署中留下beans.xml
。