2

我正在尝试使用 Mule 中的 Jersey 模块实现文件上传。

我的骡流看起来像这样:

<flow name="rest-service">
    <inbound-endpoint address="http://localhost:9999/testupload"/>
    <jersey:resources>
        <component class="com.example.test.UploadFileResource"/>
    </jersey:resources>
</flow> 

如果我没有将 @Consumes 注释放在 UploadFileResource 中的资源方法中,如下所示,当使用 multipart/form-data Content-type 发出 HTTP Post 请求并获得 HTTP 2xx 状态代码时,将调用该方法:

@Path("/uploadfile")
public class UploadFileResource {

    @POST
    public Response uploadFile2(...) {
        logger.info("Multipart Upload");
        ...
    }
}

但是,当我将@Consumes 注释与 MULTIPART_FORM_DATA 媒体类型如下所示时,该方法不会被调用并且我得到 HTTP 415 Unsupported Media type,即使 HTTP Post 请求是使用 multipart/form-data 内容类型发出的:

@Path("/uploadfile")
public class UploadFileResource {

    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile2(...) {
        logger.info("Multipart Upload");
        ...
    }
}

知道为什么即使@Consumes 媒体类型与 HTTP Post Content-type 标头匹配,为什么还会出现 415 状态吗?

4

1 回答 1

1

您可能需要按照 Jersey 文档第8.3.1.2章注册中的说明注册MultipartFeature

创建一个类似这样的类:

/**
 * 
 */
package com.verico.multipart.app;

import javax.ws.rs.ApplicationPath;

import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("/")
public class MultiPartApp extends ResourceConfig {

public MultiPartApp() {
    super(MultiPartFeature.class);
    }
}

并将以下 init-param 添加到 web.xml 中的 Jersey servlet:

     <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.verico.multipart.app.MultiPartApp</param-value>
    </init-param>
于 2014-04-11T08:42:01.187 回答