2010-12-21 3 views
35

Wir verwenden JAXB zum Generieren von Java-Klassen und haben einige Fälle festgestellt, in denen generierte Pluralmethoden nicht korrekt sind. Zum Beispiel, wo wir getPhysicians erwarten, erhalten wir getPhysicien. Wie würden wir anpassen, wie JAXB bestimmte Methoden pluralisiert?Wie passen Sie an, wie JAXB mehrere Methodennamen generiert?

Das Schema:

<xs:complexType name="physician"> 
    <xs:sequence> 
     ... 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="physicianList"> 
    <xs:sequence> 
     <xs:element name="Physician" 
        type="physician" 
        minOccurs="0" 
        maxOccurs="unbounded"/> 
    </xs:sequence> 
</xs:complexType> 

Der generierte Java-Code:

... 
public class PhysicianList { 
... 

    @XmlElement(name = "Physician") 
    protected List<Physician> physicien; 
    ... 

    public List<Physician> getPhysicien() { 
     if (physicien == null) { 
      physicien = new ArrayList<Physician>(); 
     } 
     return this.physicien; 
    } 

aktualisieren

Dies wurde von Blaise beantwortet. Ich möchte jedoch Bedenken wie JAXB-Anpassungen in einem XML-Schema nicht mischen. Also für diejenigen von Ihnen mit der gleichen Vorlieben, hier ist eine JAXB Einbindemappe, die das gleiche erreicht wie das, was Blaise vorgeschlagen, JAXB Anpassung aus dem Schema zu halten:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       version="2.0"> 

    <jaxb:bindings schemaLocation="myschema.xsd"> 
     <jaxb:bindings node="//xs:complexType[@name='physicianList']//xs:element[@name='Physician']"> 
      <jaxb:property name="physicians"/> 
     </jaxb:bindings> 
    </jaxb:bindings> 

</jaxb:bindings> 
+0

Es buchstabiert den Arzt nicht einmal richtig, sondern eher physisch * e * n. Seltsam. –

+0

XJC basiert tatsächlich auf dem Elementnamen für Listen, so dass Sie einfach Ihren Elementnamen Ärzte genannt haben könnten. ABER (und es ist ein großes, aber ...) wenn Sie dies tun, gibt es noch eine Eigenart darin, dass wenn Sie das Objekt mit JAXB erneut marschieren, jedes Element den Pluralnamen "Ärzte" haben wird. Sehr komisch. Also habe ich Ihre Herangehensweise benutzt und es funktioniert rundherum. – Simon

Antwort

29

standardmäßig nach dem für Ihr Schema erzeugt Fragment:

import java.util.ArrayList; 
    import java.util.List; 
    import javax.xml.bind.annotation.XmlAccessType; 
    import javax.xml.bind.annotation.XmlAccessorType; 
    import javax.xml.bind.annotation.XmlElement; 
    import javax.xml.bind.annotation.XmlType; 

    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "physicianList", propOrder = { 
     "physician" 
    }) 
    public class PhysicianList { 

     @XmlElement(name = "Physician") 
     protected List<Physician> physician; 

     public List<Physician> getPhysician() { 
      if (physician == null) { 
       physician = new ArrayList<Physician>(); 
      } 
      return this.physician; 
     } 

    } 

Wenn Sie Ihr XML-Schema mit Anmerkungen versehen:

<xs:schema 
     xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     jaxb:version="2.1"> 

     <xs:complexType name="physician"> 
      <xs:sequence> 
      </xs:sequence> 
     </xs:complexType> 

     <xs:complexType name="physicianList"> 
      <xs:sequence> 
       <xs:element name="Physician" 
          type="physician" 
          minOccurs="0" 
          maxOccurs="unbounded"> 
         <xs:annotation> 
          <xs:appinfo> 
           <jaxb:property name="physicians"/> 
          </xs:appinfo> 
         </xs:annotation> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 

    </xs:schema> 

Dann können Sie die gewünschte Klasse erzeugen:

import java.util.ArrayList; 
import java.util.List; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "physicianList", propOrder = { 
    "physicians" 
}) 
public class PhysicianList { 

    @XmlElement(name = "Physician") 
    protected List<Physician> physicians; 

    public List<Physician> getPhysicians() { 
     if (physicians == null) { 
      physicians = new ArrayList<Physician>(); 
     } 
     return this.physicians; 
    } 

} 
+2

Das hat super funktioniert. Vielen Dank! Zu Ihrer Information: Ich mag es nicht, Bedenken wie JAXB-Anpassungen in einem XML-Schema zu mischen. Daher habe ich am Ende meiner Frage ein Beispiel für die Verwendung einer Bindungsdatei hinzugefügt, um das Gleiche zu tun, wie Sie es vorschlagen. Danke noch einmal! – SingleShot

+0

Ich habe versucht, die von Ihnen vorgeschlagene Lösung, und die Klassen generiert haben immer noch nicht die Rückgabetypen, die ich gerne haben würde. Ich habe dafür eine andere Frage gestellt (http: // stackoverflow.com/questions/4502229/how-do-Sie-anpassen-wie-jaxb-generiert-Plural-Methode-Namen). Ich würde Ihre Hilfe sehr schätzen, wenn Sie sich Zeit nehmen, diese Frage auch zu beantworten. –

11

Vielleicht ist es ein wenig zu beantworten zu spät, aber es ist eine andere Art und Weise einfach mehrere Namen zu generieren, ohne XML-Schema und JAXB Bindungen zu mischen.

Mit JAXB XJC Bindung Compiler mit dem "-Extension" -Modus. Eine Anpassung Bindungsdatei Bedarf hinzugefügt werden, wie diese hier:

<?xml version="1.0"?> 
<jxb:bindings version="1.0" 
       xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
       jxb:extensionBindingPrefixes="xjc"> 

    <jxb:globalBindings>    
    <xjc:simple/> 
    </jxb:globalBindings> 

</jxb:bindings> 

Referenzen:

Verwandte Themen