2015-11-02 23 views
7

Uso Jersey in un server Web Jetty incorporato. Tutto funziona bene, tranne in un caso molto specifico. Ho una lista di utenti, e quando il cliente è POST s/utente, vorrei aggiungere l'utente alla lista. Nessun problema, a meno che non voglia controllare gli utenti esistenti per eliminare tutti gli utenti che hanno lo stesso nome utente (per aggiornare l'utente).Il jetty non viene caricato con ArrayIndexOutOfBoundsException quando utilizzo il codice specifico di Java 8

@POST 
public void createUser(User user) { 
    // The first line causes the failure: 
    InventoryServer.getUsers().removeIf(e -> e.getUsername().equals(user.getUsername())); 
    InventoryServer.getUsers().add(user); 
    InventoryServer.save(); 
} 

La cosa strana è che Jetty non inizierà nemmeno quando questa linea esiste. Mi dà un ArrayOutOfBoundsException. Ho eseguito il debug del programma al momento dell'eccezione e sembra che si sia verificato nel metodo SignatureParser.current(). Diverse persone online hanno affermato che ciò accade quando si esegue il codice di 8 byte Java con una libreria chiamata asm, che, in verità, ho scoperto essere una dipendenza del server jetty. Non è stato possibile aggiornarlo, poiché la versione più recente di Jetty richiede una versione precedente di asm.

Immagino che una soluzione sarebbe semplicemente non utilizzare alcuna funzionalità specifica di Java 8, ma questa sembra una soluzione piuttosto incompleta. C'è un modo per risolvere questo problema e continuare a utilizzare Java 8?

Ecco la traccia dello stack:

java.lang.ArrayIndexOutOfBoundsException: 207 
    at org.objectweb.asm.ClassReader.readUTF(ClassReader.java:1976) 
    at org.objectweb.asm.ClassReader.readUTF8(ClassReader.java:1951) 
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:515) 
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:425) 
    at org.glassfish.jersey.server.internal.scanning.AnnotationAcceptingListener.process(AnnotationAcceptingListener.java:167) 
    at org.glassfish.jersey.server.ResourceConfig.scanClasses(ResourceConfig.java:850) 
    at org.glassfish.jersey.server.ResourceConfig._getClasses(ResourceConfig.java:808) 
    at org.glassfish.jersey.server.ResourceConfig.getClasses(ResourceConfig.java:723) 
    at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1120) 
    at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1093) 
    at org.glassfish.jersey.server.ResourceConfig.createRuntimeConfig(ResourceConfig.java:1089) 
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:275) 
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:262) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:244) 
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:626) 
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:405) 
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:875) 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:346) 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772) 
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:259) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
    at org.eclipse.jetty.server.Server.start(Server.java:405) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
    at org.eclipse.jetty.server.Server.doStart(Server.java:372) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at edu.uhd.armyInventory.server.InventoryServer.<init>(InventoryServer.java:74) 
    at edu.uhd.armyInventory.server.InventoryServer.main(InventoryServer.java:110) 
Exception in thread "main" MultiException[javax.servlet.ServletException: [email protected]==org.glassfish.jersey.servlet.ServletContainer,-1,false, java.net.BindException: Address already in use] 
    at org.eclipse.jetty.server.Server.doStart(Server.java:347) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at edu.uhd.armyInventory.server.InventoryServer.<init>(InventoryServer.java:74) 
    at edu.uhd.armyInventory.server.InventoryServer.main(InventoryServer.java:110) 
    Suppressed: java.net.BindException: Address already in use 
     at sun.nio.ch.Net.bind0(Native Method) 
     at sun.nio.ch.Net.bind(Net.java:433) 
     at sun.nio.ch.Net.bind(Net.java:425) 
     at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) 
     at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) 
     at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:326) 
     at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80) 
     at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:244) 
     at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
     at org.eclipse.jetty.server.Server.doStart(Server.java:384) 
     ... 3 more 
Caused by: javax.servlet.ServletException: [email protected]==org.glassfish.jersey.servlet.ServletContainer,-1,false 
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:647) 
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:405) 
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:875) 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:346) 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772) 
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:259) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
    at org.eclipse.jetty.server.Server.start(Server.java:405) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
    at org.eclipse.jetty.server.Server.doStart(Server.java:372) 
    ... 3 more 
Caused by: java.lang.ArrayIndexOutOfBoundsException: 207 
    at org.objectweb.asm.ClassReader.readUTF(ClassReader.java:1976) 
    at org.objectweb.asm.ClassReader.readUTF8(ClassReader.java:1951) 
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:515) 
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:425) 
    at org.glassfish.jersey.server.internal.scanning.AnnotationAcceptingListener.process(AnnotationAcceptingListener.java:167) 
    at org.glassfish.jersey.server.ResourceConfig.scanClasses(ResourceConfig.java:850) 
    at org.glassfish.jersey.server.ResourceConfig._getClasses(ResourceConfig.java:808) 
    at org.glassfish.jersey.server.ResourceConfig.getClasses(ResourceConfig.java:723) 
    at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1120) 
    at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1093) 
    at org.glassfish.jersey.server.ResourceConfig.createRuntimeConfig(ResourceConfig.java:1089) 
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:275) 
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:262) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:244) 
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:626) 
    ... 14 more 
+0

Quale versione stai utilizzando? Jetty 9.2.0 dovrebbe essere a posto con le funzionalità di Java 8. Potrebbe essere necessario aggiornare anche Jersey. – TMBT

+0

Sto usando 9.3.5, ma aggiornerò Jersey e provalo. – Hassan

+0

@TMBT Uhh .. che potrebbe aver risolto il problema. Ho aggiornato Jersey a 2.22.1 e il server sta iniziando con il lambda sul posto. Potresti postare una risposta? – Hassan

risposta

5

Avrete bisogno di avere una versione Molo di almeno 9.2.0 e l'aggiornamento a Jersey 2.22.1 per Java supporto 8 caratteristiche.

+1

Per chiunque altro di fronte allo stesso problema, consiglio di installare Jersey 2.8, poiché con questo stesso setup avevo 2.22.1 ha causato l'inaccessibilità delle risorse. Non sono sicuro del perché e non mi interessa, perché 2.8 lo ha risolto. – Hassan