我在 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();
}