2016-09-21 5 views
1
  • Hallo an alle.

entwickelte ich eine Webservice, die mit einer RESTful API auf Jetty läuft mit Jersey 2. ich später musste eine Datei-Upload-Methode (hauptsächlich für XLS/XML-Dateien) erstellen, und ich versuchte Jersey 2 des Multipart-Bibliotheken zu verwenden für es.Datei-Upload mit Jersey 2 und Jetty

Da jedoch der Server startet, wirft es sofort eine seltsame Ausnahme:

2016-09-21 01:13:13.578:INFO:oejs.AbstractConnector:main: Started [email protected]{HTTP/1.1,[http/1.1]}{0.0.0.0:8080} 
Exception in thread "main" java.lang.NoClassDefFoundError: org/glassfish/jersey/internal/inject/ExtractorException 
at org.glassfish.jersey.media.multipart.internal.FormDataParamValueFactoryProvider.createValueFactory(FormDataParamValueFactoryProvider.java:436) 

[........................ .....................]

Jetty Server

public static void main(String[] args) { 

    final ResourceConfig resourceConfig = new ResourceConfig(API.class); 
    resourceConfig.packages("the_package_where_these_classes_are"); 
    resourceConfig.register(MultiPartFeature.class); 

    ServletHolder jerseyServlet 
      = new ServletHolder(new ServletContainer(resourceConfig)); 

    Server jettyServer = new Server(8080); 
    ServletContextHandler context = new ServletContextHandler(jettyServer, "/"); 
    context.addServlet(jerseyServlet, "/*"); 

    try { 
     jettyServer.start(); 
     jettyServer.join(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     //jettyServer.destroy(); 
     // got an IllegalStateException uncommenting this and didn't quite understand why 
    } 
} 

Endpunkte/Jersey/JAX-RS

import org.glassfish.jersey.media.multipart.FormDataContentDisposition; 
import org.glassfish.jersey.media.multipart.FormDataParam; 

import javax.ws.rs.*; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import java.io.InputStream; 


@Path("/") 
public class API { 

@POST 
@Path("test") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadFile(@FormDataParam("file") InputStream uploadedInputStream, 
          @FormDataParam("file") FormDataContentDisposition fileDetails) throws Exception { 


    System.out.println(fileDetails.getFileName()); 
    return Response.ok().build(); 
} 
} 

Anwendung configs

import org.glassfish.jersey.media.multipart.MultiPartFeature; 

import javax.ws.rs.core.Application; 
import java.util.Set; 

public class ApplicationConfig extends Application { 

@Override 
public Set<Class<?>> getClasses() { 
    Set<Class<?>> resources = new java.util.HashSet<>(); 
    resources.add(MultiPartFeature.class); 
    resources.add(API.class); 

    return resources; 
} 
} 

Abhängigkeiten Maven

<dependencies> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-servlet</artifactId> 
     <version>9.3.11.v20160721</version> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet-core</artifactId> 
     <version>2.7</version> 
    </dependency> 
    <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-multipart --> 
    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-multipart</artifactId> 
     <version>2.23.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-multipart</artifactId> 
     <version>2.23.2</version> 
    </dependency> 

</dependencies> 

Bin ich mit etwas falsch Abhängigkeit? Sollte dieser einfache Service nicht funktionieren? Ich habe Multipart nie zuvor benutzt, also habe ich versucht, mehrere Internetquellen/Tutorials zu verwenden.

Vielen Dank im Voraus!

FIXED änderte ich die Version auf die neueste in allen Jersey Abhängigkeiten und es funktionierte!

+0

 final ResourceConfig resourceConfig = new ResourceConfig(ApplicationConfig.class); resourceConfig.packages("com.econorma.rest"); resourceConfig.register(MultiPartFeature.class); ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(resourceConfig)); 

warum Sie Jersey-media-mehrt zweimal haben? – ravthiru

+0

Es war mein Fehler beim Einfügen | – spine

Antwort

0

jersey-media-multipart hängt von jersey-common, fügen

<dependency> 
     <groupId>org.glassfish.jersey.core</groupId> 
     <artifactId>jersey-common</artifactId> 
     <version>2.23.2</version> 
    </dependency> 
+0

ravthiru, es löste noch nicht das Problem, es ist die gleiche Ausnahme werfen. – spine

0

Für mich wie unten gearbeitet: Das ist ApplicationConfig Klasse

@ApplicationPath("/") 
public class ApplicationConfig extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     final Set<Class<?>> resources = new HashSet<Class<?>>(); 
     resources.add(MultiPartFeature.class); 
     resources.add(EntryPoint.class); 
     return resources; 
    } 

    @Override 
    public Map<String, Object> getProperties() { 
     Map<String, Object> properties = new HashMap<String, Object>(); 
     properties.put("jersey.config.server.provider.packages", "com.econorma.rest"); 
     return properties; 
    } 
} 
Verwandte Themen