Post

Visualizzazione dei post da maggio, 2013

Come definire e utilizzare a runtime delle custom Annotation

DOMANDA: Come si definiscono delle Annotation custom per utilizzarle nel mio programma? RISPOSTA: Le Annotation introdotte in Java 5 consentono di definire dei metadata per tre diversi livelli di scoping : SOURCE - Annotation disponibile solo nello scope del sorgente e viene ignorato dal compilatore CLASS - Annotation disponibile nello scope dal compilatore in fase di compilazione, ma viene ignorata dalla Java Virtual Machine (JVM) RUNTIME - Annotation disponibile nello scope della JVM in modo che possa essere utilizzato da l'ambiente di runtime Le Annotation NON aggiungono logica all'applicazione e non sono uno strumento per programmare componenti. Sono invece in grado di fornire delle informazioni (metadati) per capire meglio il tipo di codice che stiamo eseguendo ed eventualmente intraprendere delle azioni o eseguire delle configurazioni ). In questo post ci concentreremo sulle Annotation di tipo RUNTIME per riuscire ad eseguire delle azioni durante l'esec

Abilitazione Cross Application Scope in Tomcat per condivisione dati tra webapp

DOMANDA: Come posso condividere dati tra diverse webapp utilizzando l'Application Scope? RISPOSTA: Di default l' Application Scope è utilizzato per memorizzare oggetti a livello di web application. Questo livello di scope è il più alto rispetto ai classici scope di Request e Session Nome Scope Durata Request Singola richiesta, verso il server Fino a quando la risposta non viene inviata al client Session Tutte le richieste inviate dallo stesso browser Fino a quando non scade il timeout della sessione o l'ID di sessione non viene invalidato (ad es. chiusura del browser) Application Tutte le richieste inviate a una stessa Web Application Container Per poter recuperare un oggetto memorizzato a livello di Application Scope è necessario utilizzare il ServletContext . Se vogliamo recuperare un oggetto memorizzato nell'Application Scope della WebAppA dalla WebAppB è necessario fare attenzione ai seguenti

La ricorsione in Java

Immagine
DOMANDA: Che cos'è la ricorsione? RISPOSTA: La ricorsione è forse una delle prime cose che si studiano in programmazione e, diciamoci la verità, non è così intuitiva per chi è alle prime armi. A cosa serve la ricorsione ? A creare dei cicli (o chiamate cicliche) in maniera alternativa al classico for. In questo post cerchiamo di semplificarne il concetto utilizzando Java, ma è praticamente uguale in tutti i linguaggi di programmazione. Guardiamo subito un esempio a scopo puramente didattico: package ricorsione; public class RicorsioneTest { public static void main(String[] args) { int variabile = metodoRicorsivo(); } public static int metodoRicorsivo(){ return metodoRicorsivo(); } } Cosa succede eseguendo questo frammento di codice? Innanzitutto  sconsiglio di eseguirlo dato che sarà un'inconclusiva Exception a Runtime ( java.lang.StackOverflowErrorloop )! In pratica l'unica riga di codice del main richiama un metodo che richiama se stess

Realizzare un servizio REST con JAX-RS 2.0 e Jersey 2.0

DOMANDA: Come realizzo un servizio REST 2.0 e un client per testarlo? RISPOSTA: Per addentrarsi nel mondo REST consiglio di leggere il post REST 2.0: Definizione e configurazione con il framework Jersey . Il post spiega brevemente i concetti REST e cosa occorre per configurare un ambiente che lo utilizzi. La lettura servirà anche per conoscere quali sono i jar da includere nei progetti che stiamo per realizzare. In questo post creeremo un Servizio REST  che risponderà, con un semplice "echo", alle richieste di un Client. Partiamo con la programmazione del Servizio. Creiamo un nuovo Dynamic Web Project in Eclipse denominato RESTfulService e ricordiamoci di selezionare, nell'ultimo step del wizard, di creazione la checkbox " Generate web.xml deployment descriptor ".  Questa opzione ci permetterà di avere a disposizione un web.xml di base creato da Eclipse da modificare secondo le nostre preferenze (ovviamente non è un passo obbligatorio, ma di sicur

REST 2.0: Definizione e configurazione con il framework Jersey

DOMANDA: Cos'è REST e come configurare un ambiente per utilizzarlo? RISPOSTA: REST ( RE presentational S tate T ransfer ) è un paradigma per la definizione di architetture distribuite.  I suoi principi si basano sulla leggerezza e sull'utilizzo dei metodi offerti dal protocollo HTTP : Ogni entità/operazione viene rappresentata come una Risorsa Per l'invocazione si utilizzano i metodi HTTP  (GET,PUT,POST,DELETE) La rappresentazione dei dati è snella (es. JSON ) REST non è un concetto nuovo: un sito web rispetta i principi REST, cosi come un feed RSS. Di recente si sta estendendo il concetto REST alle architetture orientate ai servizi, oggi principalmente basate su HTTP/SOAP. Una funzionalità/servizio che rispetta i principi REST è denominata  RESTful . In Java esiste la specifica JAX-RS (JSR-339) che regola l'utilizzo di REST. L'ultima release di JAX-RS è la 1.1 ma è in fase di approvazione la versione 2.0 che introduce migliorame

ClassCastException con oggetto in ClassLoader diversi

Immagine
DOMANDA: Perchè ricevo un errore di ClassCastException se dalla mia webapp recupero lo stesso oggetto creato da un'altra webapp? RISPOSTA: Di solito questo errore si verifica quando stiamo utilizzando un oggetto in due class loader diversi . Ad esempio ho una webapp A che utilizza un oggetto X del jar X.jar presente nella sua WEB-INF/lib . Decido di recuperare l'oggetto X dalla webapp B che avrà anch'essa nella sua WEB-INF/lib il jar X.jar . In questo caso è vero che l'oggetto X è lo stesso ma viene caricato sia nel class loader di A che in quello di B. Ciò comporta la generazione di un errore di ClassCastException quando si tenta di recuperare l'oggetto X da B. Per ovviare facilmente a questo errore si potrebbe decidere di inserire il jar X.jar in un class loader condiviso tra le due webapp A e B (ad esempio il class loader dell'Application Server). Una soluzione più elegante, che offre una serie di vantaggi e rispetta le tecniche d