2017-08-30 26 views
0

我有一个REST服务托管在卡拉夫内,除多部分请求外,它可以正常工作。我正在使用com.sun.jersey软件包,因为我只成功地在Karaf中托管这些内容以便通过HTTP访问。JAX-RS多部分与com.sun.jersey

当我尝试接收POST内HttpServletRequest并调用其getParts()方法,我得到的错误:

IllegalStateException: No multipart config for servlet

我发现,我很想念我的servlet 注解,所以我将其添加到我正在使用的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的方法,但我一直无法通过Karaf内部的HTTP访问这些包(服务似乎无误地注册,但所有请求都返回404响应)。

+0

访问所有的零部件为什么你想在一个servlet使用多,当你想与新泽西州这样做。请参阅[本文](https://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/)用于Jersey 1.x多部分支持 –

+0

该文章使用多部分中具体命名的部分请求。我需要能够处理方法本身内未知数量的部分,这就是我试图使用'HttpServletRequest'的原因。有没有办法使用泽西来实现这一点呢? –

+0

@peeskillet也许值得强调的是,我在Karaf中运行这个,所以我有这个servlet注册在与Karaf一起安装的'HttpService'上,因为这是我设法在其中托管一个RESTful服务的唯一方法卡拉夫可以通过HTTP访问(即在本地主机上:8181)。如果有更好的方法来处理,那么任何方向将不胜感激 –

回答

1

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

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