2012-04-13 4 views
1

So gegeben Ich habe Klasse Name:Kann MOXy POJO nur mit Getter serialisieren, ohne die Annotation explizit an jedem Getter platzieren zu müssen?

class Name { 
    private String first; 
    private String middle; 
    private String last; 

    public getFirst() { return first; } 
    public getMiddle() { return middle; } 
    public getLast() { return last; } 
} 

Ich mag würde Instanzen dieser Klasse XML mit der Zuordnung zur Serialisierung ohne jede Eigenschaft in der Mapping-XML zur Liste mit:

<java-types> 
    <java-type name="Name"> 
     <java-attributes> 
      <xml-element java-attribute="first"/> 
      <xml-element java-attribute="middle"/> 
      <xml-element java-attribute="last"/> 
     </java-attributes> 
    </java-type> 
</java-types> 

ich also ideal möchte Mapping-Datei wie diese haben:

<java-types> 
    <java-type name="Name" xml-accessor-type="GETTERS"/> 
</java-types> 

ich habe nur für die Serialisierung wie folgt bestimmt einige Legacy DTO Klassen für (n o Setter absichtlich) mit 30 oder mehr Eigenschaften und idealerweise möchte ich vermeiden, jede einzelne Eigenschaft in der Mapping-Datei aufzulisten.

Antwort

0

Hinweis: Ich bin das EclipseLink JAXB (MOXy) Blei und Mitglied der JAXB 2 (JSR-222) Expertengruppe.

Für diesen Anwendungsfall würde ich den Feldzugriffstyp empfehlen. Wenn dies angegeben wird, verwendet die JAXB-Implementierung die Felder (Instanzvariablen), um auf die Daten zuzugreifen, anstatt die Eigenschaft zu durchlaufen (Methode "get"). Im Folgenden werde ich zeigen, wie dies mit moxy externen Mapping-Dokument Erweiterung zu tun:

bindings.xml

<?xml version="1.0"?> 
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="forum10141543"> 
    <java-types> 
     <java-type name="Name" xml-accessor-type="FIELD"> 
      <xml-root-element/> 
     </java-type> 
    </java-types> 
</xml-bindings> 

Namen

package forum10141543; 

class Name { 
    private String first; 
    private String middle; 
    private String last; 

    public Name() { 
    } 

    public Name(String first, String middle, String last) { 
     this.first = first; 
     this.middle = middle; 
     this.last = last; 
    } 

    public String getFirst() { return first; } 
    public String getMiddle() { return middle; } 
    public String getLast() { return last; } 
} 

jaxb.properties

Um MOXy als Ihr JAXB zu spezifizieren prov Sie müssen eine Datei namens jaxb.properties im selben Paket wie Ihre Domänenklassen mit dem folgenden Eintrag hinzufügen.

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory 

Demo

Der folgende Code zeigt, wie in den Bindungen passieren Datei, wenn die Bootstrapping JAXBContext:

package forum10141543; 

import java.util.*; 
import javax.xml.bind.*; 
import org.eclipse.persistence.jaxb.JAXBContextFactory; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(1); 
     properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum10141543/bindings.xml"); 
     JAXBContext jc = JAXBContext.newInstance(new Class[] {Name.class}, properties); 

     Name name = new Name("Jane", "Anne", "Doe"); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(name, System.out); 
    } 

} 

Ausgabe

<?xml version="1.0" encoding="UTF-8"?> 
<name> 
    <first>Jane</first> 
    <middle>Anne</middle> 
    <last>Doe</last> 
</name> 

Weitere Informationen