2017-08-30 34 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(); 
}