【问题标题】:org.glassfish.jersey upload file with FormDataContentDispositionorg.glassfish.jersey 使用 FormDataContentDisposition 上传文件
【发布时间】:2015-06-07 00:24:56
【问题描述】:

http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/ 我正在遵循本指南并遇到问题。我有一些问题。

  1. 所有依赖都必须对应吗?我的项目有一些 org.glassfish.jersey 依赖项,本指南建议使用 org.sun.jersey。我是否也必须使用相同的版本来更改它?

    <dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
    <version>2.16</version>
    </dependency>
    <dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.16</version>
    

  2. 我有这个错误

    org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization. [[FATAL] No injection source found for a parameter of type public ***.***.****.common.dto.response.AbstractResponse ***.***.****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService.upload(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class ***.***.****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@90516e]}, definitionMethod=public ***.***.***.common.dto.response.AbstractResponse ***.***.*****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService.upload(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=file1, defaultValue=null], Parameter [type=class org.glassfish.jersey.media.multipart.FormDataContentDisposition, source=file1, defaultValue=null]], responseType=class ***.***.***.common.dto.response.AbstractResponse}, nameBindings=[]}']
    

    这是我的网络服务

    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces(MediaType.APPLICATION_JSON)
    public AbstractResponse upload(@FormDataParam("file1") InputStream file1,
                               @FormDataParam("file1") FormDataContentDisposition filename1
                              ) {
    

    这是我的电话:

    $.ajax({
          url: 'http://localhost:8080/******/webapi/m2m/upload',
          data: fd,
          processData: false,
          contentType: 'multipart/form-data',
          type: 'POST',
          success: function(data){
            alert(JSON.stringify(data));
            return;
          }
        });
    

如果 Web 服务只有 1 个参数(FormData InputStream),则它是可访问的。如何解决?

  1. 我还想为 Web 服务添加另一个字符串参数。我该怎么办?

感谢 peeskillet 的回答。有点多余。

SEVERE: The web application [/linterm2m] created a ThreadLocal with key of type [org.jvnet.hk2.internal.PerLocatorUtilities$1] (value [org.jvnet.hk2.internal.PerLocatorUtilities$1@df94b1]) and a value of type [java.util.WeakHashMap] (value [{}]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.

【问题讨论】:

    标签: java rest glassfish multipartform-data jersey-2.0


    【解决方案1】:

    如果您的项目使用的是 org.glassfish,那么您使用的是 Jersey 2。com.sun 是 Jersey 1,您永远不应将两者混用。话虽如此,您面临的错误很可能是由于您没有注册MultipartFeature。在启动时验证资源模型(资源方法)的“正确性”时,如果未注册该功能,则该功能特定的注释是未知的,就像没有注释一样。而且你不能有多个没有注释的方法参数。

    如果你使用ResourceConfig,你可以简单地使用

    public class JerseyConfig extends ResourceConfig {
        public JerseyConfig() {
            register(MultiPartFeature.class);
        }
    }
    

    如果您使用的是 web.xml,那么可以为您注册的 Jersey servlet 设置一个&lt;init-param&gt;

    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
    </init-param>
    

    “我还想为网络服务添加另一个字符串参数,我该怎么办?”

    您需要将其作为多部分请求的一部分,并且客户端需要确保也将其作为多部分的一部分发送。在服务器端,只需添加另一个 @FormDataParam("anotherString") String anotherString 作为方法参数。至于客户端,我不知道 jQuery 会对此有所帮助。尚未测试,但您可以尝试this,它显示数据已附加到FormParam。这是something with Angular,我自己在其中构建了请求正文。可能有点多,因为您可能不需要显式设置内容类型。

    【讨论】:

    • 感谢 web.xml 部分。我在其他任何地方都找不到它。我现在正在检查更多的东西。
    • 现在效果很好。再次感谢您的努力。以防万一你知道,我可以问一下这个错误吗?我会把它放在帖子 SEVERE: The web application [/linterm2m] created a ThreadLocal with key type [org.jvnet.hk2.internal.PerLocatorUtilities$1] (value [org.jvnet.hk2.internal.PerLocatorUtilities$1@ df94b1])和 [java.util.WeakHashMap] 类型的值(值 [{}]),但在 Web 应用程序停止时未能将其删除。这很可能会造成内存泄漏。
    • 我不知道,但我今天早上读到的一件事是 Glassfish 中的 Jersey 版本问题。您使用的 Jersey 版本很可能比 Glassfish 中的版本更新。我不确定您使用的是什么版本,但请找出您正在使用的 Glassfish 的 Jersey 版本 (this might help) 并将您在项目中使用的版本更改为它。您还可以尝试将&lt;scope&gt;provided&lt;/scope&gt; 添加到两个依赖项。不确定这是否是问题所在,但您可以测试一下
    • 除此之外我不知道。我从没见过。
    • 没关系。谢谢你关于球衣的课程。评分 10/10。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2013-06-09
    • 2014-08-15
    • 1970-01-01
    • 2019-02-16
    • 2011-08-16
    • 2016-01-11
    相关资源
    最近更新 更多