Post

Visualizzazione dei post da maggio, 2012

Problemi con Eclipse: FeatureNotFoundException

DOMANDA: Ogni volta che apro Eclipse ricevo uno strano errore sul mio progetto Spring Security: An internal error occurred during: "Loading descriptor for MySpringProject.". org.eclipse.emf.ecore.xmi. FeatureNotFoundException : Feature ' global-method-security ' not found. (platform:/resource/MySpringProject/WebContent/WEB-INF/ web.xml , 45, 57) RISPOSTA: La soluzione a questo problema è banalissima, ma in effetti di difficile individuazione proprio per la causa che l'ha scatenato: la disattenzione . Infatti basta individuare all'interno del file indicato dall'errore ( web.xml ), alla riga e colonna corrispondente (45, 57), il tag "intruso" <global-method-security> . In questo caso quel tag non va messo in quel file ma nel file security.xml di Spring Security . La soluzione indicata è valida per tutti i casi analoghi che scatenano una FeatureNotFoundException .

Hibernate e Tomcat out of memory

Immagine
DOMANDA: Sto utilizzando Hibernate sulla mia web application. Dopo un po' che navigo ed effettuo query, il server Tomcat 7 smette di funzionare e ricevo questo errore: java.lang.OutOfMemoryError: PermGen space         at java.lang.ClassLoader.defineClass1(Native Method)         at java.lang.ClassLoader.defineClass(ClassLoader.java:620)         at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) Come posso risolverlo? RISPOSTA: L'accoppiata Tomcat e Hibernate funziona molto bene, ma, come tutti i  framework/applicazioni installati sul web server  richiede alcune piccole configurazioni per settare tutto al meglio. Come impostazione predefinita, Tomcat assegna pochissima memoria per i processi in esecuzione. E' proprio quello il problema, poca memoria a disposizione e il nostro framework (in questo caso Hibernate ) ne richiede di più. Vediamo come aumentarla. In Linux : 1. Cerchiamo il file catalina.sh nella carte

Stampa di immagini

DOMANDA: Come posso effettuare la stampa su carta di immagini utilizzando Java? RISPOSTA: Possiamo cambiare di poco il codice che abbiamo utilizzato in questo altro post ed essere in grado di stampare immagini su fogli di carta A4. package stampa; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.io.File; import javax.imageio.ImageIO; public class Stampa implements Printable {     public Stampa() {          try {             PrinterJob pj = PrinterJob.getPrinterJob();             pj.setJobName( "TestStampa" );             pj.printDialog();             pj.setPrintable( this );             pj.print();         } catch (PrinterException e) {             e.printStackTrace();         }     }     public i

Costruttori multipli

DOMANDA: In Java si può chiamare un costruttore da un altro costruttore? RISPOSTA: Certamente. In questo post vedremo il modo più elegante per evitare ridondanza di codice e massimizzare la manutenibilità delle nostre classi. Tutto quello che c'è da sapere è la parola chiave this(args)  che viene utilizzata per richiamare il costruttore dell'oggetto stesso. Ovviamente   args  sono gli eventuali parametri da passare al costruttore e che identificano la sua firma. Il modo migliore è partire dal costruttore con meno argomenti richiamando via via quello più corposo.  Vediamolo con un esempio (classe Costruttori.java ): package costruttori; public class Costruttori {     private int x;     private int y;    private int z;     // primo costruttore     public Costruttori() {       this (3); //richiamo il secondo    }     // secondo costruttore     public Costruttori( int x) {         this (x, 4); //richiamo il terzo    }     // terzo c

Modalità di Import

DOMANDA: Che differenza c'è tra l'import completo esplicitando il nome della classe e l'ometterlo utilizzando il wildcard "*" (asterisco)? import java.io.*; import java.io.BufferedReader; RISPOSTA: A discapito di quanto possa sembrare, il file .class non avrà differenze né di grandezza , né di velocità di esecuzione . Infatti l' import indica al compilatore soltanto dove andare a cercare le classi che utilizziamo. La prova scientifica di quanto affermato è possibile averla ricavando il checksum md5 di una classe scritta con gli import espliciti ed una con il  wildcard "*" . Il risultato sarà identico. Quindi l'unica differenza tra le due modalità di importare sta nella velocità di compilazione (perché ci metterà del tempo in più per trovare la classe all'interno del package indicato con l'asterisco). In ogni caso parliamo di tempi ridottissimi e quindi trascurabili per i medi progetti. Concludendo, gli unici

Problemi con Eclipse: punto esclamativo rosso

Immagine
DOMANDA: Non mi parte il progetto in Eclipse oppure mi parte ma senza le ultime modifiche apportate. Ho un punto esclamativo grande vicino al nome del progetto: Il Punto Esclamativo Rosso Come posso risolvere? RISPOSTA: E' uno dei problemi diffusi e difficili da rilevare perché sembra non avere un motivo apparente e, soprattutto, non ha un chiaro messaggio di errore. Il punto esclamativo vicino alla cartella del progetto è l'unico output visivo. Fortunatamente per risolverlo è sufficiente settare correttamente il Build Path del progetto. Facciamo click destro sul progetto -> Build Path -> Configure Build Path : Configure Build Path Vi si aprirà questa finestra piena di x rosse (assicuratevi di selezionare il tab Libraries ): Libraries Le x rosse stanno ad indicare che le librerie e i relativi path non esistono più o sono stati cambiati. Dovete andare a modificarli selezionando la libreria errata e cliccando su edit . A que

La "Compilazione" Java

Immagine
DOMANDA: Java è un linguaggio interpretato o compilato? RISPOSTA: In realtà Java è un linguaggio ibrido , sia compilato che interpretato . Diamo un'occhiata al processo globale: Fasi della compilazione 1.  Il primo step è il file .java che viene inviato al compilatore Java (javac) che lo trasforma in un file .class 2.  Il file .class  contiene il  Bytecode , un codice intermedio tra il compilato e il file in chiaro ed è comprensibile a tutte le Java Virtual Machine ( JVM ) installate sui diversi dispositivi (ricordiamo che la JVM è specifica per l'architettura su cui è installata). Se provate ad aprire con il Blocco Note (o un qualunque editor di testo) un file .class vi renderete conto che il file è in parte intellegibile, in parte no. 3.  La Java Virtual Machine internamente ha un Compilatore Just In Time ( JIT ) che si occupa di interpretare il Bytecode trasformandolo in codice comprensibile al calcolatore. Tale operazione non è svo

Pagina di provenienza (Referer)

DOMANDA: In una JSP (Java Server Page) posso risalire all'indirizzo della pagina di provenienza? RISPOSTA: Come in molti altri linguaggi, questa operazione è possibile anche con le Java Server Pages e ovviamente con le Servlet . L'url di provenienza prende il nome di Referer  e, grazie ai metodi già forniti dalla classe HttpServletRequest ,   possiamo riuscire nel nostro intento con questa riga di codice: String provenienza = request.getHeader( "Referer" ); Ecco un breve esempio di Servlet (Referer) : package referer; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet( "/Referer" ) public class Referer extends HttpServlet {    private static final long serialVersionUID = 1L;    publ

SendRedirect e Forward

DOMANDA: Che differenza c'è tra response.sendRedirect() e dispatcher.forward()? RISPOSTA: Benché l'effetto apparente sia quasi lo stesso, c'è una profonda differenza tra i due modi di reindirizzamento . Vediamolo nella pratica. Creiamo una piccola pagina HTML per l'invio dei dati ( "index.jsp" ): <html> <head> <title> Blog Domande e Risposte JAVA </title> </head> <body> <form method="POST" action="servlet/sendRedirect"> SendRedirect <input type="hidden" name="param" value="Lancill Blog" /> <input type="submit" value="Invia" /> </form> <form method="POST" action="servlet/forward"> Forward <input type="hidden" name="param" value="Lancill Blog" /> <input type="submit" value="Invia" /> </form> </body&

Spring Security 3.1: Hello World

Immagine
DOMANDA: Come faccio a installare Spring Security 3.1 e lanciare un'applicazione funzionante in 5 minuti? RISPOSTA: Niente paura: ecco un tutorial veloce che fa al caso vostro. Scaricate e scompattate nelle directory che preferite: Spring Security 3.1 Apache commons logging 1.1.1   AOP Alliance API 1.0 (binary jar) CGLIB JSTL 1.2 A questo punto creiamo un Progetto Web Dinamico di nome "HelloSecurity". Il progetto dovrà apparire così: Schema del progetto HelloSecurity con a destra il dettaglio delle librerie.  Scriviamo prima i files di configurazione. Dispatcher-servlet.xml: <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:context = "http://www.springframework.org/schema/context" xmlns:security = "http://www.springframework.org/schema/security" xmlns:p = "http://www.springframework.org/schema/p" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation =

@PreAuthorize

DOMANDA: Ho questo controller: @Controller public class HelloController {     @RequestMapping ( "/menu.htm" )     @PreAuthorize ( "hasRole('autore')" )    public String provaPreAuthorize(){       return "autore" ;    } } @PreAuthorize non funziona e non reagisce come dovrebbe, facendo passare anche utenti non autorizzati. Perchè viene ignorato ? RISPOSTA: Il problema inizialmente crea non pochi grattacapi. Intanto stiamo parlando di Spring Security 3.0 o successivi, perchè nelle versioni precedenti esistevano altre annotazioni meno potenti chiamate @Secure. Non mischiate mai nello stesso progetto i 2 tipi di annotazione che non funzioneranno a causa di conflitti negli xml. La soluzione è ancora una volta semplice, bisogna aggiungere nell'xml di configurazione della DispatcherServlet (e non dentro quello della Security) le seguenti righe tra gli attributi del tag beans : xmlns:security = "http://www

Configurare Spring Security 3.1

DOMANDA: Che cosa significano i tag che scrivo negli xml quando configuro Spring Security 3.1? Quali sono le impostazioni minime? RISPOSTA: Configurare Spring Security 3.1 non è difficile, ma ci si può facilmente perdere per strada se non si ha il giusto approccio al problema e se non si conoscono almeno le funzionalità di base offerte. Se cercate un'esecuzione al volo di codice funzionante, c'è un'altra mia risposta  sempre su questo blog. In questo post spiego in maniera più curata i dettagli. Visione di insieme di Spring Security 3.1: Spring Security è un framework per Java EE che si occupa di mettere in sicurezza un progetto enterprise utilizzando come concetti di base l' autenticazione , le autorizzazioni ed eventuale crittografia  della password. Per poterlo utilizzare c'è però bisogno di configurarlo in maniera opportuna e seguire delle linee guida. Questa discussione dà per scontato e ragiona su un prog