【问题标题】:File upload with Jersey 2 and Jetty使用 Jersey 2 和 Jetty 上传文件
【发布时间】:2017-01-29 01:28:45
【问题描述】:
  • 大家好。

我使用 Jersey 2 开发了一个使用 RESTful API 在 Jetty 上运行的 Web 服务。 后来我不得不创建一个文件上传方法(主要用于 XLS/XML 文件),并尝试使用 Jersey 2 的 Multipart 库。

但是,当服务器启动时,它立即抛出一个奇怪的异常:

2016-09-21 01:13:13.578:INFO:oejs.AbstractConnector:main: Started ServerConnector@17f62e33{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)

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

码头服务器

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

端点/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();
}
}

应用程序配置

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,所以我尝试通过几个 Internet 资源/教程。

提前致谢!

已修复

我在所有 Jersey 依赖项中将版本更改为最新版本,并且成功了!

【问题讨论】:

  • 为什么你有两次 jersey-media-multipart ?
  • 我粘贴错了|

标签: java maven jakarta-ee jersey jetty


【解决方案1】:

jersey-media-multipart 依赖于 jersey-common ,添加

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

【讨论】:

  • ravthiru,它仍然没有解决问题,它抛出了同样的异常。
【解决方案2】:

对我来说,工作如下:

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

【讨论】:

    【解决方案3】:

    Jersey 提供了相应版本的示例。您可以将以下依赖项添加到项目中,并使用 IDE 的“下载源代码”功能,您可以下载此示例的源代码。通过单击 pom parent,您也可以查看相同球衣版本的所有示例。希望有帮助!

        <dependency>
            <groupId>org.glassfish.jersey.examples</groupId>
            <artifactId>multipart-webapp</artifactId>
            <version>${jersey.version}</version>
        </dependency>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多