1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Simple Framework - Verschiedene Elemente mit gleicher Oberklasseeinlesen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von J4y, 23.08.2011.

  1. J4y, 23.08.2011 #1
    J4y

    J4y Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    2
    Registriert seit:
    12.06.2011
    Hallo alle miteinander,

    ich habe eine XML-Datei in der eine Liste von Elementen, die von der gleichen Klasse in Java erben - hier Name
    XML-Datei
    Code:
    <myTown>
        <name type="myname">Peter</name>
        <name type="myname">Paul</name>
        <name type="myadress">The White House</name>
        <name type="myname">Daisy</name>
    </myTown>
    in Java möchte ich das ganze wie folgt abbilden:
    Name
    Code:
    @Root(strict=false)
    public abstract class Name {    
        public abstract  String getValue();
    }
    
    MyName
    Code:
    public class MyName extends Name{
        @Text
        protected String value;
    
        public MyName(String value) {
            super();
            this.value = value;
        }
    
        public String getValue() {
            return value;
        }
    }
    
    MyAddress
    Code:
    @Element
    public class MyAddress extends Name{
        @Text
        protected String value;
      
        public MyAddress(String value) {
            super();
            this.value = value;
        }
    
        public String getValue() {
            return value;
        }
    }
    MyTown - Oberelement
    Code:
    @Root
    public class MyTown {    
        @ElementList(inline=true,entry="name")
        protected List<Name> names;
    }
    Da das Framework nicht in der Lage ist, Unterklassen von Namen zu finden, habe ich mir überlegt, dass ich hierfür einen eigenen Konverter erstelle, der über das Attribut Type die entsprechenden Klassen erzeugt
    Code:
    public class MyConverter implements Converter<Name>{
    
        @Override
        public Name read(InputNode node) throws Exception {
            InputNode typeNode = node.getAttribute("type");
            String type = typeNode.getValue();
            String name = node.getValue();
            
            if(type.equals("myname")){
                return new MyName(name);
            } else if(type.equals("myaddress")){
                return new MyAddress(name);
            }
            return null;
        }}
    Insgesamt funktioniert das jedoch nicht. Wenn ich das so einlese wird der Fehler geworfen, dass von Name keine Instanz erzeugt werden kann.
    Daher meine Frage: Ist an dem Code etwas falsch? Muss das @Convert vielleicht an eine andere Stelle?

    Hinweis: Dies ist nur ein Minimal-Beispiel meines Problems. Die XML Datei empfange ich bei meinem Programm von einem Server.
    Als Konsequenz kann ich also nicht das Class-Attribut einfach hinzufügen und die Architektur kann insgesamt nicht verändert werden
     
  2. Neeldarax, 23.08.2011 #2
    Neeldarax

    Neeldarax Erfahrener Benutzer

    Beiträge:
    170
    Erhaltene Danke:
    31
    Registriert seit:
    07.12.2010
    Hi J4y,

    ...

    regards

    EDIT: Hab ma den Unsinn gelöscht. Nach dem Testen hab ich verschiedene Ergebnisse bekommen. Jetzt weiß ich nicht wo der Fehler liegt XD

    Aber ggfs. solltest du nachgucken, wo du von der Klasse Name eine Instanzierung machst. (könnte die Ursache sein)
     
    Zuletzt bearbeitet: 23.08.2011
  3. J4y, 23.08.2011 #3
    J4y

    J4y Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    2
    Registriert seit:
    12.06.2011
    Hi Neeldarax,

    danke für deine Antwort!
    An der Sache liegt es aber leider nicht. Auch wenn eine Klasse abstrakt ist kann sie über Konstruktoren verfügen und Unterklassen können durchaus super aufrufen.
    Ansonsten wäre es natürlich ein einfacher blöder Fehler gewesen :-D Das wäre mir gerade fast sogar lieber^^

    Ich hab mittlerweile in Erfahrung bringen können, dass die Elemente in der richtigen XML (in diesem Beispiel nicht abgebilded) ein Attribut xsi:type haben. Das scheint wohl auch ein Standard zu sein. Mir würde es also auch helfen, wenn ich das explizit bearbeiten könnte.
     
  4. J4y, 24.08.2011 #4
    J4y

    J4y Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    2
    Registriert seit:
    12.06.2011
    Ich selber erstelle keine Instanz von Name. Das ist das was durch das Framework gemacht wird. Und hier liegt eben das Problem.
    In der Klasse MyTown ist eine Liste mit Elementen vom Type Name vorgegeben. Und das Framework ist hier nicht in der Lage die entsprechende Unterklasse von Name zu finden. Das geht ja auch nicht ohne weiteres in Java. Daher suche ich eine Möglichkeit hier dem Framework mitzuteilen welche Klasse es verwenden soll.
    Auf der HP der Entwickler steht, dass man in der XML Datei selber ein bestimmtes Attribut angeben kann, das die Klasse spezifizert. Die Strutkur des Dokumentes ist aber fest vorgegeben. Ich brauche also eine Möglichkeit dies zb. über Annotation zu tun.
     

Diese Seite empfehlen