2016-09-21 2 views
1
  • Приветствуем всех.

Я разработал веб-сервис, который работает на Jetty с RESTful API с использованием Джерси 2. позже мне пришлось создать метод загрузки файла (в основном для XLS/файлы XML), и я попытался использовать библиотеки Jersey 2 в MULTIPART для Это.Загрузка файла с помощью Jersey 2 и Jetty

Однако, как начинается сервер, он выбрасывает сразу странное исключение:

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 сервера

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 
    } 
} 

Конечные точки/Джерси/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(); 
} 
} 

Применение конфиги

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; 
} 
} 

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> 

Могу ли я использовать некоторые неправильно зависимость? Разве эта простая служба не должна работать? Я никогда раньше не использовал Multipart, поэтому я попытался использовать несколько интернет-источников/учебников.

Заранее благодарен!

FIXED

Я изменил версию последней во всех зависимостей Джерси и это сработало!

+0

почему у вас есть джерси-медиа-многочастному дважды? – ravthiru

+0

Это была моя ошибка приклеивания | – spine

ответ

0

jersey-media-multipart зависит от jersey-common, добавьте

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

ravthiru, он все еще не решил проблему, она бросает то же исключение. – spine

0

Для меня работал, как показано ниже:

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

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

Это ApplicationConfig класс

@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; 
    } 
} 
Смежные вопросы