2010-12-21 15 views
35

Java sınıflarını oluşturmak için JAXB kullanıyoruz ve çoğul yöntem adlarının doğru olmadığı birkaç durumla karşılaştık. Örneğin, getPhysicians umduğumuz yerde getPhysicien alıyoruz. JAXB'nin belirli yöntemleri nasıl çoğaltacağını nasıl özelleştirebiliriz?JAXB'nin çoğul yöntem adlarını nasıl oluşturduğunu nasıl özelleştirirsiniz?

şema:

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

oluşturulmuş Java kodu:

... 
public class PhysicianList { 
... 

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

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

Güncelleme

Bu Blaise tarafından yanıtlandı. Bununla birlikte, bir XML şemasında JAXB özelleştirmeleri gibi endişeleri karıştırmamaya çalışıyorum. Yani aynı tercihle o sizin için, burada şema üzerinden JAXB özelleştirme tutarak, Blaise önerdi aynı şeyi başarır JAXB bağlayıcı dosyasıdır:

<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

Doktoru doğru bir şekilde hecelemese de, fizik * e * n. Garip. –

+0

XJC aslında liste için eleman ismine dayanıyor, bu yüzden eleman isminin doktorunu aramış olabilirsiniz. ANCAK (ve büyük ama ...) bunu yaparsanız, JAXB kullanarak nesneyi yeniden sıraladığınızda her elemanın çoğunun 'hekim' ismine sahip olacağı konusunda hala bir tuhaflık var. Çok tuhaf. Yani, ben senin yaklaşımını kullandım ve her yerde çalışıyor. – Simon

cevap

29

Varsayılan olarak şema için oluşturulan aşağıdaki parçası:

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

Sonra istenen sınıfı üretebilirsiniz:

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

    } 

Eğer XML şeması açıklama ise

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

Bu harika çalıştı. Teşekkürler! Bilginize, bir XML şemasındaki JAXB özelleştirmeleri gibi kaygıları karıştırmaktan hoşlanmıyorum, bu yüzden benim önerimin sonuna, önerdiğiniz gibi aynısını yapmak için bir ciltleme dosyası kullanmanın bir örneğini ekledim. Tekrar teşekkürler! – SingleShot

+0

Sizin tarafınızdan önerilen çözümü denedim ve oluşturulan sınıflar hala sahip olmayı çok istediğim dönüş türlerine sahip değil. Bunun için başka bir soru sordum [burada] (http: // stackoverflow.com/sorular/4502229/nasıl-do-you-özelleştir-how-JAXB-üretir-çoğul-yöntem-adları). Bu soruyu cevaplamak için zaman ayırırsan, yardımın için minnettar olurum. –

11

Belki cevap için biraz geç, ama XML Şeması ve JAXB Bağlar karışmadan, sadece çoğul isimler oluşturmak için başka bir yolu yoktur.

JAXB XJC bağlantı derleyicisini "-extension" modunu kullanarak.

<?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> 

Referanslar: bir özelleştirme bağlamaları dosya ihtiyacı bu bir benzeri eklenecek

İlgili konular