当前位置: 首页 > 知识库问答 >
问题:

Jersey:找不到媒体类型=multipart/form-data的MessageBodyReader

秦鸿羽
2023-03-14

我已经在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.

我通过一个 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');
    });
});

这是我的Javaendpoint:

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

我看到一些人很幸运地将endpoint方法的参数更改为使用@FormDataParam而不是FormDataMultiPart(如这里所示),但我无法编辑Java类,因此我必须按照上面的方式使用它。

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

web.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>

我能找到的唯一的另一件事是使用ResourceConfig注册MultipartFeature;但是,我正在使用的项目没有任何应用程序类或任何扩展ResourceConfig的类(这是一个部署到Tomcat的WAR,所以没有主类)。

是否需要进行其他配置?我很困惑为什么这不起作用。

共有1个答案

司寇飞航
2023-03-14

MultiPartFeature具有所需的读卡器和编写器。但您仍然需要注册该功能。正如您所提到的,您经常会在Application/ResourceConfig子类中看到它的注册。但在网络中。xml,只需将其添加到要添加为提供者的类列表中。您可以通过添加

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

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

 类似资料:
  • 我正在使用泽西岛客户endpoint击SpringMVC REST控制器的图像上传功能。我收到以下异常: 我的控制器发布图像的方法: 我的REST控制器方法获取post数据: 有没有解决这个异常的方法?我已经按照以下堆栈解决方案进行了尝试,但仍然收到相同的异常。 Jersey客户端异常:找不到消息正文编写器 使用泽西岛发送多个文件:找不到多部分/表单数据的消息正文

  • 我在我的tomcat日志中看到以下错误... 未找到 Java 类的邮件正文读取器和 Java 类型类“多部分”和“表”多部分“和”MIME 媒体类型多部分/表单数据“。与 MIME 媒体类型兼容的已注册邮件正文读取器包括:/ - 在客户端,我看到以下消息: 邮政https://dev.project.org/upload返回了415不支持的媒体类型的响应状态。 我已经搜索了一下,建议是球衣多部分

  • 问题内容: 我正在尝试简单的Jersey + JSON示例,但出现以下错误 我放入以下jar文件以获得适当的结果 为什么会出现此类错误?错误日志在这里: web.xml JsonExample.java 和Json服务 如果我做错了事,请提出建议。 问题答案: 此问题已通过jersey-bundle-1.8.jar修复

  • 此服务从移动客户端接收多部分请求,并将请求传递给下游服务以上载图像。我在下游服务中看到415种不受支持的媒体类型 获取以下异常 我的下游服务的API签名 是否有人可以指导我的代码片段中的错误,或者是否有任何需要在vertx server或vertx web client中启用的设置? 谢谢尼蒂斯·戈亚尔

  • 问题内容: 我是Django和Django REST Framework的新手。我有以下序列化程序类,用于与其他信息一起上传文件。但是,当我使用上传的文件运行API端点时,结果是这样的: 我通过谷歌搜索努力解决了这个问题,但无法解决,因此这里是我的序列化程序和API视图。 序列化器: 视图: 问题答案: 如果要发送multipart / form-data,则应使用MultiPartParser而

  • 问题内容: 自数小时以来,我一直在尝试纠正http错误,但它仍显示不支持的页面。我在邮递员中添加标题。 这是我的Java代码 这是我的档案 问题答案: 通过和如何在响应流和请求流之间对对象进行序列化和反序列化。 将会发生的是,将从提供者的注册表中进行搜索,以查找可以处理的媒体类型。如果找不到,则Jersey无法处理该请求,并将发送415不支持的媒体类型。通常,你还应该在服务器端记录一个异常。不知道