Jersey:找不到 Media type=multipart/form-data 的 MessageBodyReader

Gre*_*ers 5 java jersey

我已经在 SO 上发现了一些这样的问题,但它们似乎都没有解决我的特定问题,而且我一直无法自己找到解决方案。

这是我得到的错误:

Caused by: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=multipart/form-data; boundary=----WebKitFormBoundaryHWk1XUaeu7pEiDth, type=class org.glassfish.jersey.media.multipart.FormDataMultiPart, genericType=class org.glassfish.jersey.media.multipart.FormDataMultiPart.
Run Code Online (Sandbox Code Playgroud)

我通过一个 jQuery AJAX 请求发送这个,看起来像这样:

$('#upload-image-form').on('submit', function(e) {
    e.preventDefault();
    var data = new FormData(this);
    $.ajax({
        url: url,
        method: 'POST',
        contentType: false,
        processData: false,
        data: data,
    }).done(function(data) {
        console.log(data);
    }).fail(function(res, status) {
        onError(res, status, 'Image upload failed');
    });
});
Run Code Online (Sandbox Code Playgroud)

这是我的 Java 端点:

@POST
@Path("/{userId}")
@Consumes("multipart/form-data")
public Response createGraphic(
   @PathParam("userId") int userId,
   FormDataMultiPart multiPartFormData) { ... }
Run Code Online (Sandbox Code Playgroud)

我见过几个人有改变端点方法的参数使用@FormDataParam代替FormDataMultiPart(如图运气在这里),但我不能编辑Java类,所以它是如何上面我必须使用它。

我的 pom.xml 具有以下依赖项:

<dependency>
    <groupId>org.jvnet</groupId>
    <artifactId>mimepull</artifactId>
    <version>1.6</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.12</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
    <version>2.12</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

网页.xml

<servlet>
   <servlet-name>Jersey</servlet-name>
   <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
   <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>my.package</param-value>
   </init-param>
   <load-on-startup>5</load-on-startup>
</servlet>

<servlet-mapping>
   <servlet-name>Jersey</servlet-name>
   <url-pattern>/api/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

我唯一能够挖掘的另一件事是使用 ResourceConfig 注册 MultiPartFeature;但是,我正在使用的项目没有任何 Application 类或任何扩展 ResourceConfig 的类(它是部署到 Tomcat 的 WAR,因此没有主类)。

是否还有其他配置需要完成?我很难过为什么这不起作用。

Pau*_*tha 2

拥有MultiPartFeature所需的读者和作者。但您仍然需要注册该功能。正如您所提到的,您经常会看到它在Application/ResourceConfig子类中注册。但在 web.xml 中,您只需将其添加到类列表中即可添加为提供程序。您可以通过添加<init-param>到 servlet 配置来做到这一点,即

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>
        org.glassfish.jersey.media.multipart.MultiPartFeature,
        some.other.Provider
    </param-value>
</init-param>
Run Code Online (Sandbox Code Playgroud)

正如您在示例中看到的,如果您需要注册任何其他提供程序/功能,则可以用逗号分隔类名称。