私は最初のプロジェクト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>
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>
これらのトピックは私を助けていない:
Tomcatは最低限のJSP/Servletコンテナであるため、CDIをそのままサポートしていません。 CDIをどのくらい正確にインストールしましたか?コードをコンパイルするためだけにjavaee-api.jar
に/WEB-INF/lib
をドロップしましたか?ああ、いや、これは正しい方法ではありません。 Java EE API JARにはAPIクラスのみが含まれ、具体的な実装は含まれません。 JAR全体を取り除きます。この回答で説明されているような、他の多くの移植性の問題を引き起こす可能性があります。 Eclipseプロジェクトにjavax.servlet APIをインポートするにはどうすればよいですか? 具体的なAPIとともに具体的な実装をインストールする必要があります。
次の2つのオプションがあります。
Tomcatをドロップして、真のJava EEコンテナーを探します。 Tomcatを使用している場合は、 TomEE にステップオーバーします。 TomEE WebプロファイルZipファイルをダウンロードする は本当に簡単で、Tomcatの場合とまったく同じ方法で展開してEclipseに統合します。 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
の重要性と、「ターゲットランタイムは既にこの機能を提供しています」などの意味に注意してください。 Mavenを介してJSFライブラリを適切にインストールおよび構成する方法 も参照してください。
Tomcatに真のCDI実装をインストールします。 Weld は、利用可能なCDI実装の1つです。 The Weld installation guide に、Tomcatに統合する方法の説明があります。完全性と将来の参照のために、次の手順を実行します。
Webappのweld-servlet-shaded.jar
に /WEB-INF/lib
をドロップします。 Mavenを使用している場合は、 この座標 を使用します。
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet-shaded</artifactId>
<version>3.0.5.Final</version>
</dependency>
次のコンテンツで/META-INF/context.xml
ファイルをwebappに作成します。
<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サーブレットバージョンでは、web.xml
にもCDI BeanマネージャーとWeldリスナーを明示的に登録する必要がありますが、現在のバージョンでは不要です)。
CDI実装としてWeldよりもOpenWebBeansを好む場合、詳細なMavenインストール手順についてはこのブログを参照してください。 TomcatにCDIをインストールする方法
具体的な問題とは無関係、Tomcat 7のJSP/Servlet APIはnotJava EE 7のAPIに準拠する代わりに、Java EE 6(サーブレット3.0/JSP 2.2)に準拠します。 Java EE 7(サーブレット3.1/JSP 2.3)に相当するTomcatが必要な場合は、Tomcat 8をご覧ください。 Apache Tomcatバージョンマトリックス もご覧ください。
その他の可能なオプションは、beans.xml
デプロイメント内。