6

プロパティプレースホルダーからCDI Beanにプロパティ値を注入する方法は何ですか?

春には次のように書きます。

@org.springframework.beans.factory.annotation.Value("${webservice.user}")
private String webserviceUser;

プロパティファイル/プロパティプレースホルダーからwebserviceUserフィールドをプロパティに設定するもの。webservice.user

CDIでそれを行う方法は?いくつかの答えを見つけようとしましたが、同等のものは見つかりませんでした。ただし、CDI をアプリケーション サーバーの Spring の代替として使用でき、その使用例は非常に基本的であるため、簡単な方法があるはずですが、残念ながら見つけられませんでした。

4

1 に答える 1

4

CDI は Dependecy Injection と Context に関する仕様であるため、そのままではそのような構成はありません。しかし、サードパーティのプロジェクトが新しいポータブル機能を追加できるようにする非常に強力な拡張メカニズムも提供します (つまり、すべての CDI 実装で動作し、サーバーに関連付けられていません)。CDI 拡張機能を提供する最も重要なプロジェクトはApache Deltaspikeです。朗報です。必要なものを提供してくれます。

したがって、プロジェクトに deltaspike-core を追加する必要があります。Maven を使用する場合は、この依存関係を pom.xml に追加する必要があります。

    <dependency>
        <groupId>org.apache.deltaspike.core</groupId>
        <artifactId>deltaspike-core-api</artifactId>
        <version>0.4</version>
    </dependency>

    <dependency>
        <groupId>org.apache.deltaspike.core</groupId>
        <artifactId>deltaspike-core-impl</artifactId>
        <version>0.4</version>
    </dependency> 

その後、プロパティのファイル名を気にしない場合はMETA-INF/apache-deltaspike.properties、プロジェクトに追加してプロパティを入れてください。複数のファイルが必要な場合、または名前を選択したい場合は、次のPropertyFileConfigように各ファイルのインターフェイスを実装する必要があります。

public class MyCustomPropertyFileConfig implements PropertyFileConfig
{
    @Override
    public String getPropertyFileName()
    {
        return "myconfig.properties";
    }
} 

その後、このような値を注入できるようになります

@ApplicationScoped
public class SomeRandomService
{
    @Inject
    @ConfigProperty(name = "endpoint.poll.interval")
    private Integer pollInterval;

    @Inject
    @ConfigProperty(name = "endpoint.poll.servername")
    private String pollUrl;

    ...
 }

Deltaspike のドキュメントから抜粋したこの例でわかるように、文字列だけでなく、Integer、Long、Float、Boolean フィールドにも値を挿入できます。より具体的なものが必要な場合は、独自のタイプを提供できます。Deltaspike の構成ドキュメントは、ここにあります。

于 2013-07-23T18:50:15.013 に答える