Esercitazione JAX-B


1. Esercizio: Client JAXB

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] 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 XmlRootElement con i dati mancanti.

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

Il tipo di una classe si verifica con il costrutto instance of:

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

Footer BGFooter BG
Tito Flagella - © 2007-2015