2017-08-17 1 views
1

Ich stoße auf ein Problem. Ich habe einen org.osgi.service.cm.ManagedService Impl-Client für eine OSGI-Konfiguration. Die Konfiguration ist eine Sammlung von Schlüssel/Wert-Paaren. Die Schlüssel in diesen Eigenschaften, wenn sie an die aktualisierte Methode (ManagedService.updated) der ManagedService als java.util.Dictionary Objekt übergeben werden, scheinen Groß-und Kleinschreibung, d. H. props.get("HellO") funktioniert, obwohl der Schlüssel in der Konfig "Hallo" ist.Osgis Config ManagedService-Wörterbuchschlüssel ohne Berücksichtigung der Groß- und Kleinschreibung

Wenn ich dieses Wörterbuch in eine Hashmap durch Iterieren über seine Einträge konvertieren, werden die Schlüssel in der Karte Groß-und Kleinschreibung wie erwartet. Wird erwartet, dass die Schlüssel in Dictionary Groß- und Kleinschreibung nicht beachten?

Dies wurde auf einer AEM 6.2-Instanz getestet.

Hier ist meine ManagedService impl-Klasse.

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; 
} 

Die ManagedService impl wird als Dienst registriert die folgenden Code.

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); 

Antwort

3

Dies ist gemäß der Konfiguration Admin Service-Spezifikation.

Der Name oder der Schlüssel einer Eigenschaft muss immer ein String-Objekt sein, und ist während nachschlagen nicht case-sensitive, sondern muss den ursprünglichen Fall bewahren.

Apache Felix Quellcode als Referenz. https://github.com/apache/felix/blob/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/CaseInsensitiveDictionary.java

/** * Die CaseInsensitiveDictionary ist ein * java.util.Dictionary die den Anforderungen entspricht, die von dem die Eigenschaft * Namen zu behalten, falls erforderlich Service Specification Admin-Konfiguration gelegt *, aber Fall zu ignorieren beim Zugriff auf die Eigenschaften. */

+3

Der Grund, dass die Schlüssel Groß- und Kleinschreibung sind zum Zeitpunkt (2000), dass es wie X.500-Spezifikationen sieht wichtig sein würden. X.509-Zertifikate, SNMP und LDAP sind die wenigen Dinge, die übrig geblieben sind. Groß- und Kleinschreibung wurde zum Standard und wir hatten schlechte Entscheidungen getroffen. Einer der Nachteile eines Standards, der nicht rückwärtskompatibel ist. –

Verwandte Themen