2016-07-03 1 views
1

Ich benutze Grails 2.5.3 und habe eine Domain-Klasse Person.So passen Sie den Namen des Stammelements für einen XML-Marshaller in Grails an

Ich habe einen XML-Marshaller von Person erstellt, und es erstellt ein XML mit "Person" als Name des Stammelements. Abhängig von der Rolle der Person möchte ich das Wurzelelement "Patient" oder "Arzt" nennen, aber es gibt keine Dokumentation in Grails, noch auf Websites von Implementierern.

Das einzige, was ich finden konnte, wie das Wurzelelement Namen für die Sammlung XML Einweiser anpassen, wie: Grails XML marshalling: change default "<list>" root element name

Gibt es eine Möglichkeit das Stammelementname für das Objekt XML Einweiser von Customizing?

Was ich habe, zur Zeit ist:

XML.registerObjectMarshaller(Person) { person, xml -> 
     xml.build { 
      uid(person.uid) 
      firstName(person.firstName) 
      lastName(person.lastName) 
      dob(person.dob) 
      sex(person.sex) 
      idCode(person.idCode) 
      idType(person.idType) 
      organizationUid(person.organizationUid) 
     } 
} 

Antwort

2

Die registerObjectMarshaller Methode, die Sie verwenden, hat eine Überlastung, die eine ObjectMarshaller Instanz nimmt. Um den Namen des Root-Elements zu überschreiben, muss der Marshaller, den Sie registrieren, auch die NameAwareMarshaller-Schnittstelle implementieren.

Die Antwort in dem Post, den Sie verknüpften, behandelt all dies, indem ein Objekt registriert wird, das sich von CollectionMarshaller erstreckt, das ein Implementierer von ObjectMarshaller und NameAwareMarshaller ist.

Um den Namen des Stammelements so anzupassen, wie Sie möchten, müssen Sie eine Klasse erstellen, die ObjectMarshaller und NameAwareMarshaller implementiert. Ihre Verwendung der registerObjectMarshaller Methode besteht darin, eine Schließung zu übergeben, die von ObjectMarshaller.marshallObject(...) verwendet wird. Sie können den Rumpf des Abschlusses in der Implementierung der marshalObject-Methode der neuen Klasse verwenden.

class PersonMarshaller implements ObjectMarshaller<XML>, NameAwareMarshaller { 

    boolean supports(Object object) { 
     return object instanceof Person; 
    } 

    String getElementName(Object o) { 
     if (object instanceof Patient) { 
      return "patient"; 
     } else if (object instanceof Doctor) { 
      return "doctor"; 
     } else { 
      return "patient"; 
     } 
    } 

    void marshalObject(Object object, XML xml) { 
     Person person = (Person) object; 

     xml.build { 
      uid(person.uid) 
      firstName(person.firstName) 
      lastName(person.lastName) 
      dob(person.dob) 
      sex(person.sex) 
      idCode(person.idCode) 
      idType(person.idType) 
      organizationUid(person.organizationUid) 
     } 
    } 
} 
Verwandte Themen