JAX-RS Multipart with com.sun.jersey



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

与其尝试使用 Servlet 多部分,不如使用 Jersey 的多部分支持。在链接的示例中,它使用命名部件。如果希望能够处理所有未知零件,只需使用FormDataMultiPart作为方法参数。通过这种方式,您可以使用getFields()访问所有零件

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

最新更新