com.sun.jersey 的 JAX-RS 多部分

JAX-RS Multipart with com.sun.jersey

我在 Karaf 中托管了一个 REST 服务,它可以很好地处理除多部分请求之外的所有请求。我正在使用 com.sun.jersey 包,因为我只成功地将这些包托管在 Karaf 内部,以便通过 HTTP 访问。

当我尝试在其上接收 HttpServletRequest inside the POST and call the getParts() 方法时,出现错误:

IllegalStateException: No multipart config for servlet

我发现我的 servlet 上缺少 @MultipartConfig 注释,所以我将其添加到我正在使用的 servlet 实现中。我扩展 com.sun.jersey.spi.container.servlet.ServletContainer 并向 class 添加注释。但这不起作用。

我也试过使用我自己的 HttpServlet class 扩展,重现了错误:

@MultipartConfig
public class MultipartServlet extends HttpServlet {

    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {

        try {
            final HttpServletRequest httpRequest = (HttpServletRequest)request;
            final Collection<Part> parts = httpRequest.getParts();

            System.out.println("There are " + parts.size() + " parts");
        }
        catch (Exception exception) {
            System.out.println("MEGA FAIL");
            System.out.println(exception.getMessage());
        }

        super.service(request, response);
    }
}

我已经看到使用 org.glassfish.jersey packages that makes registers the class 和 ResourceConfig 的方法,但我无法在 Karaf 内部通过 HTTP 访问这些包(服务似乎注册没有错误,但所有请求 return 404 响应)。

您无需尝试使用 Servlet 多部分,只需使用 Jersey's multipart support. In the example in the link, it uses named parts. If you want to be able to process all unknown parts, you can just use FormDataMultiPart 作为方法参数即可。这样您就可以使用 getFields()

访问所有部分
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response post(FormDataMultiPart multiPart) {
    final Map<String, List<FormDataBodyPart>> = multiPart.getFields();
}