我正在创建我的第一个项目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>
这些主题对我没有帮助:
- Java EE 6 @javax.annotation.ManagedBean vs. @javax.inject.Named vs. @javax.faces.ManagedBean
- Target Unreachable identifier resolved to null
- Target Unreachable, identifier resolved to null
- javax.el.PropertyNotFoundException : Target Unreachable, identifier 'login' resolved to null Spring + JSF
- http://www.andrejkoelewijn.com/blog/2010/03/05/jee-cdi-tip-target-unreachable-identifier-resolved-to-null/
2条答案
按热度按时间0sgqnhkj1#
Tomcat作为一个准框架JSP/Servlet容器,不支持现成的CDI。将
jakartaee-api.jar
或javaee-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,下面的坐标就足够了。
请注意
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,请使用以下坐标:对于Tomcat 10.x,请改用
weld-servlet-shaded.jar
of version 4.x:1.(可选)在webapp中创建包含以下内容的
/META-INF/context.xml
文件:只有当依赖于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?
vxf3dgd42#
另一个可能的选择是在部署中保留
beans.xml
。