2010-07-12 5 views
2

Dans mon schéma j'ai quelques types qui étendent simplement un type XSD simple (int ou string). JAXB crée une classe Java distincte par type. Je souhaite supprimer cette classe intermédiaire et configurer JAXB pour utiliser des primitives lorsque cela est possible (par exemple, remplacer CountryType par java.lang.String et DocumentType par int ou lava.lang.Integer). Par exemple, pour un XSD donné, il serait bon d'avoir DestinationType.setDocumentType(int) et List<String> StatesType.getCountry(). Je suis heureux d'écrire an adapter à l'échelle du type pour cela, mais il semble que seules les conversions à partir de types XML primitifs sont prises en charge. Peut-être qu'il est possible de faire la conversion par type de propriété? S'il vous plaît, donnez un exemple de personnalisation de liaison JAXB, qui peut aider.Substitution JAXB de type complexe avec le type primitif

<?xml version="1.0" encoding="UTF-8"?> 
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:exch="http://www.mycompany.org/exchange" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    targetNamespace="http://www.mycompany.org/exchange" 
    elementFormDefault="qualified" attributeFormDefault="unqualified"> 

    <complexType name="countryType"> 
     <simpleContent> 
      <extension base="string"/> 
     </simpleContent> 
    </complexType> 

    <complexType name="statesType"> 
     <sequence maxOccurs="unbounded"> 
      <element name="country" type="exch:countryType"/> 
     </sequence> 
    </complexType> 

    <complexType name="documentType"> 
     <simpleContent> 
      <extension base="integer"/> 
     </simpleContent> 
    </complexType> 

    <complexType name="destinationType"> 
     <sequence> 
      <element name="states" type="exch:statesType" maxOccurs="1"/> 
      <element name="document-type" type="exch:documentType" minOccurs="1" maxOccurs="1"/> 
     </sequence> 
    </complexType> 
</schema> 

Répondre

2

Une autre possibilité, pouvez-vous changer votre schéma ?:

Le changement de schéma suivant va générer votre modèle d'objet désiré.

Utilisation:

<simpleType name="documentType"> 
    <restriction base="integer"/> 
</simpleType> 

Au lieu de:

<complexType name="documentType"> 
    <simpleContent> 
     <extension base="integer"/> 
    </simpleContent> 
</complexType> 
+0

cette transformation peut être appliquée sans casser la compatibilité XML sérialisé? –

+0

@dma_k - Oui, les représentations XML pour les deux types sont les mêmes. –

0

Bonne question. Dans le passé, j'ai résolu ce problème en exécutant le schéma via une étape de pré-traitement XSLT, "aplatissant" la hiérarchie des types tout en conservant la sémantique des documents. Par exemple, XSLT abandonnerait la définition du type documentType et remplacerait chaque référence par documentType par integer. Le schéma traité résultant représente toujours les mêmes documents d'instance, mais il est plus simple et permet une liaison plus agréable.

Cette solution (plutôt semi-cuite) peut s'appliquer à un certain nombre de problèmes similaires à faire avec un schéma trop complexe (par exemple en remplaçant des groupes de substitution par des structures de choix).

Questions connexes