2010-08-04 12 views
8

La documentazione JAXB è come un libro di testo, e semplicemente non ho tempo per imparare tutto JAXB prima che sia necessario usarlo.JAXB Work-Flow - Come si entra in JAXB

Ho un XSD, se voglio usare JAXB per effettuare il marshall e un-marshal qual è il flusso di lavoro?

Non ho bisogno di alcuna specifica solo una vista di alto livello.

quello che so già: 1. JAXB può essere usato per prendere gli oggetti e creare documenti XML da loro e viceversa 2. Esso utilizza qualche strumento misterioso di nome "XJC", che non sono stato in grado di trovare un download di ANYWHERE sul loro sito web 3. XJC crea le classi per te in base a XSD

Per prima cosa, come trovo XJC? In realtà so che è installato sul mio sistema, non so da dove l'ho preso.
In secondo luogo, qualunque sia questo strumento e come è arrivato alla mia macchina, come posso farlo funzionare con la versione più aggiornata di JAXB? In terzo luogo, quindi se le mie modifiche XSD devo davvero ricreare l'intero oggetto Java, quindi invalidando tutti i miei test? O posso definire un oggetto per i mapping XSD in modo che io possa controllare la mappatura, non una generazione di codice predefinita?

Sono principalmente abituato a prendere XML e usare qualcosa di simile a xStream per farlo manualmente, ma questa non è più un'opzione per i miei scopi.

risposta

15

Supponendo di avere JDK6;

xjc è nella bin/cartella della JDK, qualcosa di simile a C: \ Program Files (x86) \ Java \ jdk1.6.0_20 \ bin \ xjc.exe

Il JDK è dotato di JAXB, mentre ci potrebbero essere versioni più recenti in giro da http://jaxb.java.net/ o altre implementazioni disponibili, probabilmente non è necessario preoccuparsi di questo a questo punto.

JAXB può fare un sacco di cose, non sono completamente sicuro esattamente di quello che stai cercando di realizzare. Se hai un xsd, puoi generare classi java da esso eseguendo, ad es.

xjc -p com.mypackage myschema.xsd 

E includere le classi generate nel progetto (più tipicamente lo eseguiresti come parte del processo di compilazione).

O posso definire oggetto di mapping XSD in modo che io sono in controllo della mappatura, non qualche generazione di codice di default?

Le classi generate sono solo pojos con alcune annotazioni, è possibile creare tali classi e avere il pieno controllo della mappatura tramite annotazioni.

Come detto, JAXB può fare un sacco di cose, ecco solo alcuni esempi di base, SearchParam/SearchType è una classe generata da xjc da un piccolo personalizzato .xsd

serializzare un oggetto in un file XML

JAXBContext context = JAXBContext.newInstance(SearchParam.class); 
Marshaller marshaller = context.createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
List<String> hours = new LinkedList<String>(); 
hours.add("2009.12.11"); 
hours.add("2009.12.13"); 

SearchParam param = new SearchParam(); 
param.setFilter("greater"); 
param.setHours(hours); 
param.setSearchType(SearchType.Fuzzy); 
marshaller.marshal(param, new FileWriter("/tmp/SearchParam.xml"));  

deserializzare un file XML

JAXBContext context = JAXBContext.newInstance(SearchParam.class); 
Unmarshaller unMarshaller = context.createUnmarshaller(); 
SearchParam param = (SearchParam) unMarshaller.unmarshal(
        new FileInputStream("/tmp/SearchParam.xml")); 

Deserialize e fare la convalida dello schema

JAXBContext context = JAXBContext.newInstance(SearchParam.class); 
Unmarshaller unMarshaller = context.createUnmarshaller(); 
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI) 
       .newSchema(new File("/tmp/schema1.xsd")); 
unMarshaller.setSchema(schema); 
SearchParam param = unMarshaller.unmarshal(
         new FileInputStream("/tmp/SearchParam.xml")); 

Maggiori informazioni

+0

In primo luogo, grande risposta, apprezzato. Domanda: Quindi normalmente creeresti gli oggetti java e poi li copi incollandoli nel tuo progetto? Dici che spesso fa parte dello script di build, ma a me sembra tutto indietro, perché allora come saprai che il codice che stai scrivendo che usa quegli oggetti verrà compilato, tanto meno eseguito come previsto? Inoltre, cose come il completamento automatico non potrebbero funzionare perché gli oggetti non esistono finché non si crea il progetto. – walnutmon

+0

Certo, "copia/incolla" il codice generato è ok - l'inconveniente è che devi ricordarti di farlo quando lo schema cambia. Se lo fai come parte della tua build, il completamento automatico funzionerà correttamente, devi solo eseguire la build una volta prima. Indipendentemente dal fatto che il tuo progetto compili o funzioni come previsto non è diverso dall'esecuzione di xjc "a mano", e potresti avere un test unitario che cattura la maggior parte di tali errori. – nos

1

Probabilmente hai già installato XJC. Controlla la directory bin dell'installazione di JDK 6. Una volta trovato se si esegue XJC, verranno fornite le opzioni della riga di comando.

JAXB è una specifica, quindi non ci sono più implementazioni:

  • Metro (RI), le emissioni di allineare a stretto contatto con gli aggiornamenti JDK quindi se avete una recente JDK si dovrebbe essere buono.
  • Moxy JAXB, parte di EclipseLink disponibile qui, http://www.eclipse.org/eclipselink/moxy.php

Se si modifica lo schema si sarà in grado di ottimizzare il vostro modello a oggetti, in particolare con le estensioni moxy.

Per iniziare vedere: http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted