2017-08-17 4 views
1

問題が発生しています。私はosgi構成のためにorg.osgi.service.cm.ManagedService implクライアントを持っています。構成は、キーと値のペアの集合です。 の更新されたメソッド(ManagedService.updated)にjava.util.Dictionaryオブジェクトとして渡されたこれらのプロパティのキーは、大文字と小文字が区別されないようです。つまり、configのキーが "Hello"であってもprops.get("HellO")が機能します。Osgi Config ManagedServiceディクショナリキーで大文字と小文字を区別しない

辞書をHashmapに変換すると、そのエントリを反復処理することで、マップのキーが大文字と小文字を区別します。 Dictionaryのキーで大文字と小文字を区別しないと予想されますか?

これはAEM 6.2インスタンスでテストされました。

ここは私のManagedService implクラスです。

public class ConfigService implements ManagedService { 

public void updated(final Dictionary props) throws ConfigurationException { 
    // props.get("HellO") returns value 
    if (props != null) { 
     String pid = (String) props.get(Constants.SERVICE_PID); 
     // convert to map 
     Map map = map(props); 
     // map.get("HellO") returns null 
     // map.get("Hello") returns value 
    } 
} 

private static Map map(Dictionary dict) { 
    Map map = new ConcurrentHashMap(); 
    for (Enumeration keys = dict.keys(); keys.hasMoreElements();) { 
     Object key = keys.nextElement(); 
     map.put(key, dict.get(key)); 
    } 
    return map; 
} 

ManagedServiceは、以下のコードを使用してサービスとして登録されています。

final Dictionary props = new Hashtable(); 
props.put(Constants.SERVICE_PID, "pid.of.the.osgi.configuration"); 
ServiceRegistration configSvc = context.registerService(ManagedService.class.getName(), 
       new ConfigService(), props); 

答えて

3

これは、Configuration Admin Serviceの仕様と同じです。

プロパティの名前またはキーは常にStringオブジェクトであること、およびルックアップ中 大文字と小文字を区別しませんが、元のケースを保持しなければならない必要があります。

Apache felixソースコードを参考にしてください。 https://github.com/apache/felix/blob/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/CaseInsensitiveDictionary.java

/** * CaseInsensitiveDictionaryは、プロパティを必要とするコンフィギュレーション管理サービス仕様によって を*レイアウト要件に準拠* java.util.Dictionary ある *名ケースを維持するが、ケースを無視しますプロパティにアクセスするとき */

+3

キーは大文字小文字を区別していることの理由は、X.500の仕様が重要になるだろうし、のような時間(2000年)で、それが見えることです。 X.509証明書、SNMP、およびLDAPは、私が残したいくつかの事を推測しています。大文字と小文字が区別され、私たちは悪い決断をしていました。下位互換性を失う標準の欠点の1つ。 –

関連する問題