JAXB mit Map und Color

Diskutiere JAXB mit Map und Color im XML und Co. Forum; Hallo zusammen, ich bin vor kurzem auf die Java Schnittstelle JAXB gestoßen und versuche momentan aus einer XML-Datei heraus eine Hashmap zu...

  1. Demli
    Demli Neues Mitglied
    Hallo zusammen,
    ich bin vor kurzem auf die Java Schnittstelle JAXB gestoßen und versuche momentan aus einer XML-Datei heraus eine Hashmap zu generieren, die jeweils einen String Eintrag als Schlüsselwert und einen Farbwert in sich trägt.

    Da die normale Color Klasse nicht die entsprechenden Annotations in sich trägt habe ich dazu eine eigene Klasse implementiert, die im Kern eigentlich nur eben diese Annotations zur Color-Klasse hinzufügt:

    Code (Java):

    @XmlRootElement
    class JAXBColor extends Color{

        //Zur Nutzung der JAXB-Schnittstelle muss die Klasse über einen parameterlosen Konstruktor verfügen
        public JAXBColor()
        {
            super(0);
        }
     
        public JAXBColor(int rgb) {
            super(rgb);
        }
     
        @Override
        @XmlElement
        public int getRed()
        {
             return super.getRed();
        }
     
        @Override
        @XmlElement
        public int getBlue()
        {
              return super.getBlue();
        }
     
        @Override
        @XmlElement
        public int getGreen()
        {
             return super.getGreen();
        }
     
     }
     
    Die Hashmap befindet sich in einer selbsterstellten Klasse, die auch die entsprechenden Annotations in sich trägt um JAXB kompatibel zu sein:

    Code (Java):

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    class SystemColors{
     
       @XmlElement
       Map<String,JAXBColor> colors;
     
       //Zur Nutzung der JAXB-Schnittstelle muss die Klasse über einen parameterlosen Konstruktor verfügen
       public SystemColors(){
           colors  = new HashMap<String, JAXBColor>();
       }
     
       public SystemColors(Map<String,JAXBColor> map){
           setMap(map);
       }
     
       public void setMap(Map<String,JAXBColor> map){
           colors = map;
       }
     
       public Map getMap(){
           return colors;
       }
     
       public Color getColor(String key){
           JAXBColor jc = colors.get(key.toUpperCase());
           Color c = new Color(jc.getRGB());
           return c;
       }
     
       public boolean contains(String key){
           return colors.containsKey(key);
       }
    }
     
    Die Idee ist jetzt, aus einer entsprechenden XML-Datei eine Map zu generieren mit der ich dann auf die in ihr abgelegten Farbobjekte zugreifen kann.
    Die dazugehörige XML-Datei sieht so aus:

    Code (XML):

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <systemColors>
        <colors>
     
            <entry>
                <key>ROT</key>
                <value>
                    <blue>59</blue>
                    <green>28</green>
                    <red>212</red>
                </value>
            </entry>
         
            <entry>
                <key>SCHWARZ</key>
                <value>
                    <blue>0</blue>
                    <green>0</green>
                    <red>0</red>
                </value>
            </entry>
         
            <entry>
                <key>DUNKELGRUEN</key>
                <value>
                    <blue>30</blue>
                    <green>134</green>
                    <red>117</red>
                </value>
            </entry>
         
           <entry>
                <key>GRUEN</key>
                <value>
                    <blue>40</blue>
                    <green>200</green>
                    <red>170</red>
                </value>
            </entry>
         
           <entry>
                <key>ORANGE</key>
                <value>
                    <blue>22</blue>
                    <green>147</green>
                    <red>232</red>
                </value>
            </entry>
         
           <entry>
                <key>GRAU</key>
                <value>
                    <blue>179</blue>
                    <green>178</green>
                    <red>177</red>
                </value>
            </entry>
         
           <entry>
                <key>DUNKELGRAU</key>
                <value>
                    <blue>86</blue>
                    <green>86</green>
                    <red>86</red>
                </value>
            </entry>
         
        </colors>
    </systemColors>
     
    Das auslesen der Hashmap stellt keine großen Probleme dar, mein Problem ist folgendes.
    Alle Farbwerte in der Hashmap unabhängig davon welche Werte in der XML eingetragen sind schwarz, sprich haben die RGB-Werte [r=0,g=0,b=0].

    Hier nochmal der Code der die XML-Datei ausliest:
    Code (Java):

               File xmlFile = new File("farbtext.xml");
               JAXBContext context = JAXBContext.newInstance(SystemColors.class);
               Unmarshaller unmarshaller = context.createUnmarshaller();
               SystemColors colors = (SystemColors) unmarshaller.unmarshal(xmlFile);
     
    Weiß jemand woran das liegt, bzw. ob das was ich versuche überhaupt ohne weiteres möglich ist?
    Habe das Gefühl das aus den in der XML abgelegten RGB-Werten, so gar kein Farbobjekt erstellt werden kann und mir deshalb immer nur ein "Standard"-Color Objekt ausgegeben wird, in dem die RGB-Werte nicht gesetzt sind.

    MfG Demli
     
  2. Vielleicht hilft dir dieser Java-Kurs hier weiter --> (hier klicken)
  3. stg
    stg Bekanntes Mitglied
    java.awt.Color (sofern du davon sprichst) ist immutable!

    Statt von Color zu erben füge deiner Klasse doch einfach die passenden Attribute hinzu. Nach dem Einlesen kannst du daraus dann leicht deine gewünschten Color-Objekte erzeugen.
     
  4. stg
    stg Bekanntes Mitglied
    Das ist aber wohl nicht der Grund. Wie auch immer, bin gerade darauf gestoßen:

    Code (Java):

    private static class ColorAdapter extends XmlAdapter<ColorAdapter.ColorValueType, Color> {

           @Override
           public Color unmarshal(ColorValueType v) throws Exception {
               return new Color(v.red, v.green, v.blue);
           }

           @Override
           public ColorValueType marshal(Color v) throws Exception {
               return new ColorValueType(v.getRed(), v.getRed(), v.getBlue());
           }

           @XmlAccessorType(XmlAccessType.FIELD)
           public static class ColorValueType {
               private int red;
               private int green;
               private int blue;

               public ColorValueType() {
               }

               public ColorValueType(int red, int green, int blue) {
                   this.red = red;
                   this.green = green;
                   this.blue = blue;
               }
           }
       }
     
     
Die Seite wird geladen...

JAXB mit Map und Color - Ähnliche Themen

JAXB: Überflüssiges Wrapper-Tag für Map-Einträge
JAXB: Überflüssiges Wrapper-Tag für Map-Einträge im Forum XML und Co.
JAXBContext / UnmarshalException / Content is not allowed in prolog / encoding="iso-8859-15"
JAXBContext / UnmarshalException / Content is not allowed in prolog / encoding="iso-8859-15" im Forum Java Basics - Anfänger-Themen
Xmlbeans und jaxb
Xmlbeans und jaxb im Forum Allgemeine Java-Themen
JAXB-XML unvollständig
JAXB-XML unvollständig im Forum XML und Co.
docx4j - Ersatz für getJaxbElement
docx4j - Ersatz für getJaxbElement im Forum Allgemeine Java-Themen
Thema: JAXB mit Map und Color