2011年7月10日 星期日

Java REST Web Service(2) Jersey multipart & sturts multipartupload

這篇文章主要介紹最近困惑了我好幾天的問題
由於目前的專案使用sturts 2 framework作為開發之框架,所以一般的檔案上傳也使用sturts的file upload套件,接下來就是問題的發生的經過
由於我們要開發的service提供使用者以multipart/form-data(RFC 2388)的http post來同時進行檔案與一般欄位數值的傳送,然而卻一直得到server回覆的404 error code
經過各種可能的錯誤猜想,發現到sturts.properties中的struts.multipart.saveDir設定才恍然大悟,
由於該專案所過濾的url pattern為/*,如下所示,故經過/rest下的所有request都先由sturts的filter進行過濾,所有multipart得資料傳送自然也就都由sturts的fileupload先處理,而不會導向後面的jersery multipart處理流程


struts2
org.apache.struts2.dispatcher.FilterDispatcher


struts2
/*


所以決定就另外自行撰寫filter,extends sturts所提供的filter,讓/rest/*以外的request依照原本的chain執行,而/rest/*下的request則bypass sturts流程

//sturts 2.1.x之後已經由StrutsPrepareAndExecuteFilter取代FilterDispatcher
//public class StrutsFilter extends org.apache.struts2.dispatcher.FilterDispatcher {
public class StrutsFilter extends org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
String uri = ((HttpServletRequest) req).getRequestURI();

if (!uri.startsWith("/rest/")) {
System.out.println(uri);
//bypass sturts filter後面的chain
super.doFilter(req, res, chain);
}else{
chain.doFilter(req, res);
}
}
}

改寫filter後至web.xml重新指定sturts2 filter


struts2
notice.filter.StrutsFilter


如此就可以避免rest的multipart被sturts2的lib處理掉

沒有留言: