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
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
Sto usando 9.3.5, ma aggiornerò Jersey e provalo. – Hassan
@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