Riscriviamo il client sviluppato per invocare il servizio Shopping di eBay utilizzando la specifica JAXB per la produzione ed il parsing dell'XML
Step 1. Recuperare il client Shopping API. Recuperiamo il client eBay sviluppato nell'esercitazione HTTP e verifichiamone il corretto funzionamento invocando il servizio.
Step 2. Generare le classi annotate Jax-B con XJC.
Utilizziamo XJC per la generazione delle classi. Possiamo farlo da linea di comando
oppure farlo fare ad Eclipse selezionando il file ShoppingService.xsd
con il tasto destro e cliccando Generate > JAXB Classes...
.
Nella schermata successiva, selezionare i progetto dove si vuole che siano generati i
sorgenti e cliccare Finish
. Verificare che il package ebay.apis.eblbasecomponents
sia presente tra i sorgenti del progetto.
Step 3. Creazione della richiesta.
Modifichiamo il client rimuovendo la porzione
di codice che crea e serializza la richiesta
in DOM e sostituiamola con l'implementazione JAXB.
Instanziamo quindi la classe GetCategoryInfoRequestType
che rappresenta la richiesta e valorizziamola
utilizzando i metodi generati dal compilatore.
Step 4. Marshalling della richiesta.
Creiamo una nuova istanza di JAXBContext
utilizzando il metodo statico newInstance
passando come parametro il nome del package da gestire
ebay.apis.eblbasecomponents
.
Utilizzando il
contesto appena instanziato, creiamo un Marshaller con il metodo
createMarshaller
per la serializzazione della
richiesta.
Per l'esecuzione del marshalling è richiesto un JAXBElement in
input che otteniamo dalla utility ObjectFactory
(generata da XJC) con il metodo createGetCategoryInfoRequest
.
Nota | |
---|---|
La necessità di utilizzare il JAXBElement è dovuta al fatto che la classe che rappresenta il nostro Root Element (GetCategoryInfoRequestType) non contiene tutte le informazioni XML necessarie alla serializzazione.
Questo perché XJC non è stato in grado di
decidere il valore di questi dati
a tempo di compilazione, altrimenti
avrebbe inserito l'annotazione |
Step 5. Unmarshalling della risposta.
Sempre dal JAXBContext
instanziato in precedenza,
create un Unmarshaller con cui deserializzare lo stream della risposta.
Verifichiamo che l'oggetto ritornato sia del tipo atteso e stampiamo le informazioni di nostro interesse tramite i metodi generati dal compilatore.
Suggerimento | |
---|---|
Il tipo di una classe si verifica con il costrutto if(object instance of JAXBElement){ (JAXBElement<?>) jaxbElement = (JAXBElement<?>) object; if(jaxb.getValue() instance of GetCategoryInfoResponseType) { GetCategoryInfoResponseType response = (GetCategoryInfoResponseType) jaxbElement.getValue(); .... } else { // ...errore, non è l'oggetto previsto } }
|
Step 6. Validazione della risposta.
Marshaller e Unmarshaller possono essere configurati per eseguire la validazione
rispetto ad uno Schema. Come per il Validator di JAXP, dobbiamo fornire una classe
che gestisca gli eventi emessi dalla validazione come quella inclusa nelle
Lai API v.1.0.3: it.unipi.di.lai.utils.CustomValidationEventHandler
.
Creiamo quindi uno Schema
ed un'istanza di CustomValidationEventHandler
ed utilizziamo i metodi setSchema
e setEventHandler
per abilitare l'unmarshaller alla validazione.
Soluzione: Client JAXB Shopping API