REST server

di il
5 risposte

REST server

Ciao,
sto cercando di far funzionare questo codice per capire se ho settato in modo corretto un progetto, ma non capisco il motivo per cui il metodo HttpServerFactory.create mi solleva una IllegalArgumentExeption inserendo un URL in formato stringa:
Questo è il main che mi da problemi:

import com.sun.jersey.api.container.httpserver.HttpServerFactory;
import com.sun.net.httpserver.HttpServer;

import java.io.IOException;

public class StartServer {
    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServerFactory.create("http://localhost:9999/");
        server.start();

        System.out.println("Server running!");

        System.out.println("Hit return to stop...");
        System.in.read();
        System.out.println("Stopping server");
        server.stop(0);
        System.out.println("Server stopped");
    }
}

e questo invece è l'errore:

Exception in thread "main" java.lang.IllegalArgumentException
	at jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:170)
	at jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:153)
	at jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:424)
	at com.sun.jersey.spi.scanning.AnnotationScannerListener.onProcess(AnnotationScannerListener.java:138)
	at com.sun.jersey.core.spi.scanning.FilesScanner$1.f(FilesScanner.java:107)
	at com.sun.jersey.core.util.Closing.f(Closing.java:71)
	at com.sun.jersey.core.spi.scanning.FilesScanner.scanDir(FilesScanner.java:104)
	at com.sun.jersey.core.spi.scanning.FilesScanner.scanDir(FilesScanner.java:95)
	at com.sun.jersey.core.spi.scanning.FilesScanner.scan(FilesScanner.java:80)
	at com.sun.jersey.core.spi.scanning.FilesScanner.scan(FilesScanner.java:74)
	at com.sun.jersey.api.core.ScanningResourceConfig.init(ScanningResourceConfig.java:80)
	at com.sun.jersey.api.core.ClasspathResourceConfig.init(ClasspathResourceConfig.java:119)
	at com.sun.jersey.api.core.ClasspathResourceConfig.<init>(ClasspathResourceConfig.java:101)
	at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:263)
	at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:246)
	at com.sun.jersey.api.container.httpserver.HttpServerFactory.create(HttpServerFactory.java:117)
	at com.sun.jersey.api.container.httpserver.HttpServerFactory.create(HttpServerFactory.java:92)
	at StartServer.main(StartServer.java:16)

Sto cercando qualche soluzione online ma non trovo nulla. Da quello che so un eccezione di questo tipo riguarda unicamente il parametro passato nel metodo, ma anche provando con una stringa vuota il risultato è lo stesso. O forse può essere un problema legato alle librerie?

5 Risposte

  • Re: REST server

    Chiarisci COSA stai usando. Jersey deduco (dal package). Quale versione? La 1.x ... presumerei (perché la 2.x NON ha la HttpServerFactory) Quali dipendenze hai nel progetto?
  • Re: REST server

    Si utilizza Jersei 1.19 e javax per gestire le annotazioni xml. Sto cercando di capirne il funzionamento perchè è un esempio didattico, però per ora dovrei semplicemente riuscire ad accedere all'url.
  • Re: REST server

    Giuso ha scritto:


    Da quello che so un eccezione di questo tipo riguarda unicamente il parametro passato nel metodo
    No, il problema NON è il url che hai passato (che è giusto).

    Jersey usa la ASM (la nota libreria di bytecode manipulation and analysis) che è stata ripacchettizzata internamente a Jersey.

    Ho preso tramite Maven/Eclipse l'artifact jersey-server versione 1.19.4 e sono andato a guardare lì
    
    Exception in thread "main" java.lang.IllegalArgumentException
    	at jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:170)
    cioè nel sorgente della classe ClassReader di ASM. E si vede (metto anche i numeri di riga):
    166    public ClassReader(final byte[] b, final int off, final int len) {
    167        this.b = b;
    168        // checks the class version
    169        if (readShort(off + 6) > Opcodes.V1_8) {
    170            throw new IllegalArgumentException();
    171        }
    Quindi la ASM sta verificando se le TUE classi hanno il class version superiore a Java 8. Se è appunto superiore, lancia IllegalArgumentException (certo .. potevano anche mettere un messaggio più parlante ... ).

    Vuol dire che stai usando un JDK superiore a Java 8 e il class version generato in fase compilazione non è quindi appropriato per la ASM.

    Soluzione: usa un JDK 8 oppure continua ad usare la versione che hai ma devi specificare di compilare avendo come "target" Java 8.
  • Re: REST server

    Il problema era proprio quello, ti ringrazio davvero!
  • Re: REST server

    Potresti forse (forse) avere ancora qualche problema con JAXB (la API per il binding con XML) ma ... dipende dalla versione del runtime Java che stai usando e/o da cosa hai come librerie dipendenti.
    Se non hai riscontrato ancora problemi a riguardo ... meglio, sei nel caso "fortunato".
Devi accedere o registrarti per scrivere nel forum
5 risposte