带有com.sun.jersey的JAX-RS Multipart

时间:2017-08-30 12:39:53

标签: java jersey jax-rs multipart karaf

我在Karaf内部托管了一个REST服务,除了多部分请求之外,所有请求都能正常工作。我正在使用com.sun.jersey个软件包,因为我只是成功地在Karaf中托管这些软件包,以便通过HTTP访问。

当我尝试在POST中收到HttpServletRequest并在其上调用getParts()方法时,我收到错误消息:

  

IllegalStateException:没有servlet的多部分配置

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

我也尝试使用我自己的HttpServlet类扩展,它会重现错误:

@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包的方法,使MultiPartFeature类与ResourceConfig一起注册,但是我无法通过HTTP访问这些包。 Karaf(这些服务似乎没有错误地注册,但所有请求都返回404响应)。

1 个答案:

答案 0 :(得分:1)

您只需使用Jersey's multipart support,而不是尝试使用Servlet多部分。在链接的示例中,它使用命名部分。如果您希望能够处理所有未知部分,则可以使用FormDataMultiPart作为方法参数。这样您就可以使用getFields()

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