1

Quartz アプリケーション内で CDI-SE コンテキストを初期化しようとしているため、次の依存関係 (maven) があります。

  <dependency>
                <groupId>org.jboss.weld.se</groupId>
                <artifactId>weld-se-core</artifactId>
                <version>2.3.4.Final</version>
            </dependency>

JobQuartz 内には、次のメソッド execute() があります。

public void execute(JobExecutionContext context) throws JobExecutionException {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();
        service = container.instance().select(MyService.class).get();
        service.go();
        weld.shutdown();
    }

しかし、次のエラーが発生しました。

Caused by: java.lang.IllegalStateException: WELD-ENV-002009: Weld SE container cannot be initialized - no bean archives found

私のプロジェクトはWARなので、beans.xmlファイルを中/src/main/webapp/META-INF/に入れて、内容を見てください:

<?xml version="1.0"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.2" bean-discovery-mode="all">

</beans>

ファイルを にコピーしました/src/main/resource/META-INFが、同じエラーが発生しました。

4

2 に答える 2

1

コメント セクションでいくつかの会話をした後、私はあなたに答えるのに十分理解していると思います.

まず、自分で Weld SE コンテナーを起動しないでください。2 つのコンテナーが並行して実行されているため (これは意図されていない/サポートされていません)、1 つの SE と 1 つの "クラシック" がコンテナーによって処理されます。簡単に起動できるコンテナハンドルのものを使いましょう。

さて、スコープのアクティブ化手段がいくつか欠けていることがわかりました。新しいバージョンの Weld を使用している場合は、インターセプターを使用できます。インターセプターはRequestContext、メソッドの前にアクティブになり (それがあなたが求めているものだと思います)、後で破棄します。そのために必要なのは、 Weld API (とにかく WFLY に含まれています)への依存関係だけであり、それを使用してメソッドまたはクラスに注釈を付けるだけです。

上記の場合、Weld 2.4.x が必要です。WildFly に簡単にパッチを適用できることに注意してください。パッチはWeld Web サイトの下部にあり、ハウツーはここにあります。

RequestContextControllerWeld 3/CDI 2.0 を使用する場合は、このライフサイクルを制御できるビルトイン Bean ( ) もあります。

Johm Ament が指摘したように、他のオプションは Deltaspike ですが、それには別の依存関係を持ち込む必要があります。

于 2017-11-21T13:01:46.433 に答える