2016-07-03 9 views
1

Grails 2.5.3を使用していて、ドメインクラスPersonを持っています。GrailsのオブジェクトXMLマーシャラーのルート要素名をカスタマイズする方法

私はPersonのXMLマーシャラを作成しました。ルート要素名として "person"というXMLを作成します。人の役割に応じて、ルート要素に "patient"または "doctor"という名前を付けたいと思いますが、Grailsにはドキュメントがなく、実装者のWebサイトにもこのドキュメントはありません。私は見つけることができる

唯一のことは、次のように、コレクションのXMLマーシャラーのルート要素名をカスタマイズする方法である:Grails XML marshalling: change default "<list>" root element name

オブジェクトのXMLマーシャラーのルート要素名をカスタマイズする方法はありますか?

は、私が現在持っていることである:あなたが使用している

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

答えて

2

registerObjectMarshaller方法はObjectMarshallerインスタンスを受け取るオーバーロードがあります。ルート要素の名前をオーバーライドするには、登録するマーシャラーもNameAwareMarshallerインターフェイスを実装する必要があります。

CollectionMarshallerから、ObjectMarshallerNameAwareMarshallerの両方の実装者であるオブジェクトを登録することで、あなたがリンクした投稿の回答がすべてを処理します。

ルート要素名を自由にカスタマイズするには、ObjectMarshallerNameAwareMarshallerを実装するクラスを作成する必要があります。 registerObjectMarshallerメソッドの使用法は、ObjectMarshaller.marshallObject(...)によって使用されているクロージャを渡しています。新しいクラスのmarshalObjectメソッドの実装では、クロージャの本体を使用することができます。

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) 
     } 
    } 
} 
関連する問題