簡體   English   中英

Jersey:找不到媒體類型= multipart / form-data的MessageBodyReader

[英]Jersey: MessageBodyReader not found for media type=multipart/form-data

我已經在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');
    });
});

這是我的Java端點:

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

我見過幾個人有改變端點方法的參數使用@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>

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; 但是,我正在使用的項目沒有任何Application類或任何擴展ResourceConfig的類(它是部署到Tomcat的WAR,所以沒有主類)。

是否還需要進行其他配置? 我很難過為什么這不起作用。

MultiPartFeature具有所需的讀寫器。 但您仍需要注冊該功能。 正如您所提到的,您經常會在Application/ResourceConfig子類中看到它的注冊。 但是在web.xml中,您只需將其添加到要添加為提供程序的類列表中。 您可以通過向servlet配置添加<init-param>來實現,即

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

正如您在示例中所看到的,如果您需要注冊任何其他提供者/功能,則可以用逗號分隔類名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM