web-dev-qa-db-ja.com

TomcatにCDIをインストールして使用するには?

私は最初のプロジェクトJava EE 7を作成していますが、問題が発生しています。ご協力をお願いします。

  • 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"

マネージド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>

これらのトピックは私を助けていない:

27

Tomcatは最低限のJSP/Servletコンテナであるため、CDIをそのままサポートしていません。 CDIをどのくらい正確にインストールしましたか?コードをコンパイルするためだけにjavaee-api.jar/WEB-INF/libをドロップしましたか?ああ、いや、これは正しい方法ではありません。 Java EE API JARにはAPIクラスのみが含まれ、具体的な実装は含まれません。 JAR全体を取り除きます。この回答で説明されているような、他の多くの移植性の問題を引き起こす可能性があります。 Eclipseプロジェクトにjavax.servlet APIをインポートするにはどうすればよいですか? 具体的なAPIとともに具体的な実装をインストールする必要があります。

次の2つのオプションがあります。

  1. 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ライブラリを適切にインストールおよび構成する方法 も参照してください。


  2. Tomcatに真のCDI実装をインストールします。 Weld は、利用可能なCDI実装の1つです。 The Weld installation guide に、Tomcatに統合する方法の説明があります。完全性と将来の参照のために、次の手順を実行します。

    1. 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>
      
    2. 次のコンテンツで/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を介して見つけることができるため、このステップは厳密には必要ありません。

    3. 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バージョンマトリックス もご覧ください。

62
BalusC

その他の可能なオプションは、beans.xmlデプロイメント内。

0
lucasvc