6

Java EE 6を使用しており、 ".properties"ファイルから構成をロードする必要があります。依存関係注入を使用して構成ファイルから値をロードするための推奨される方法(ベストプラクティス)はありますか?私はSpringのアノテーションを見つけましたが、Java EEの「標準」アノテーションは見つかりませんでした。 「私は、ファイルから構成属性を読み取ることによって、CDIを使用してアプリケーション を設定する方法の簡単な例を見つけることができませんでした".properties"ファイルを使用した依存性注入

http://weblogs.java.net/blog/jjviana/archive/2010/05/18/applicaction-configuration-java-ee-6-using-cdi-simple-example

この男は最初からソリューションを開発しました。 ..」

しかし、その代わりに、構成工場を作成するためのより標準的な方法があるのだろうか...

答えて

1

あなたの質問を正確にはカバーしていませんが、Weldのドキュメントのthis partが興味深いかもしれません。

このように、いいえ、任意のリソース/リソースファイルを挿入する標準的な方法はありません。私は、このような高度にカスタム依存の要件を標準化することは、仕様の範囲を単に超えていると思います(Springは仕様ではなく、単に好きなものを実装できます)。しかし、CDIが提供するものは、一方の側に構成保持Beanを挿入する強力な(別名タイプセーフ)メカニズムと、他方の側でそのようなBeanを読み込んで作成する柔軟なプロデューサメカニズムです。間違いなくこれはお勧めの方法です。

あなたがリンクしているアプローチは、あなたが必要とするものが多すぎるかもしれませんが、あなたが注入しようとしているプロパティの種類によっては、かなり良いものです。

CDI拡張は、(必要なすべてのクラスをうまくカプセル化する)CDI拡張を開発し、プロジェクトとは別に展開することです。もちろんCDI-extension catalog、またはApache Deltaspikeに貢献することもできます。

+0

「春が何の仕様ではありません、彼らは単にすることができます彼らが好きなものを実装する " - はい、しかし特定天国からは来ない。誰かがそれを書いた、ちょうど誰かが春を書いたように。 –

1

これを実行する唯一の「標準的な」方法は、バインディングされていないアノテーションメンバで修飾子を使用し、すべての注入が依存スコープであることを確認することです。あなたのプロデューサーでは、InjectionPointを取得し、注入ポイントの修飾子からキーを取得することができます。

@Qualifier 
public @interface Property { 
    @Nonbinding String value default ""; 
} 

... 
@Inject @Property("myKey") String myKey; 


... 
@Produces @Property public String getPropertyByKey(InjectionPoint ip) { 
    Set<Annotation> qualifiers = ip.getQualifiers 

    // Loop through qualifers looking for Property.class save that off 
    return ResourceBundle.getBundle(...).getString(property.key); 
} 

ありますが、そのコードに行うことができますいくつかの機能強化は明らかにされているが、それはあなたが正しい軌道を下に始めるために十分でなければなりません:あなたはこのような何かをしたいと思います。

1

参照のApache DeltaSpikeの@ConfigProperty

3

設定注釈

package com.ubiteck.cdi; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import javax.enterprise.util.Nonbinding; 
import javax.inject.Qualifier; 

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
public @interface InjectedConfiguration { 
    /** 
    * Bundle key 
    * @return a valid bundle key or "" 
    */ 
    @Nonbinding String key() default ""; 
    /** 
    * Is it a mandatory property 
    * @return true if mandator 
    */ 
    @Nonbinding boolean mandatory() default false; 
    /** 
    * Default value if not provided 
    * @return default value or "" 
    */ 
    @Nonbinding String defaultValue() default ""; 
} 

設定工場は次のようになります。

import java.text.MessageFormat; 
import java.util.MissingResourceException; 
import java.util.ResourceBundle; 
import javax.enterprise.inject.Produces; 
import javax.enterprise.inject.spi.InjectionPoint; 

public class ConfigurationInjectionManager { 
    static final String INVALID_KEY="Invalid key '{0}'"; 
    static final String MANDATORY_PARAM_MISSING = "No definition found for a mandatory configuration parameter : '{0}'"; 
    private final String BUNDLE_FILE_NAME = "configuration"; 
    private final ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_FILE_NAME); 

    @Produces 
    @InjectedConfiguration 
    public String injectConfiguration(InjectionPoint ip) throws IllegalStateException { 
     InjectedConfiguration param = ip.getAnnotated().getAnnotation(InjectedConfiguration.class); 
     if (param.key() == null || param.key().length() == 0) { 
      return param.defaultValue(); 
     } 
     String value; 
     try { 
      value = bundle.getString(param.key()); 
      if (value == null || value.trim().length() == 0) { 
       if (param.mandatory()) 
        throw new IllegalStateException(MessageFormat.format(MANDATORY_PARAM_MISSING, new Object[]{param.key()})); 
       else 
        return param.defaultValue(); 
      } 
      return value;    
     } catch (MissingResourceException e) { 
      if (param.mandatory()) throw new IllegalStateException(MessageFormat.format(MANDATORY_PARAM_MISSING, new Object[]{param.key()})); 
      return MessageFormat.format(INVALID_KEY, new Object[]{param.key()}); 
     } 
    } 

Tutorial with explanation and Arquillian test

+0

ありがとう!ここでBUNDLE_FILE_NAMEをプログラム的に変更するにはどうすればよいですか?たとえば、プログラムaは "a.properies"とプログラムB "bを使用することができます。このコードを共有したいと思っています –

+0

注入されているファイルをどのように定義するのですか?どこから読み込みますか? – f1wade

関連する問題