2013-10-25 45 views
1

我使用2.3.1澤西在Glassfish 4新澤西2.X問題與MultivaluedMap

我的資源的方法是類似以下內容:

 @POST 
     @Consumes("application/x-www-form-urlencoded") 
     @Path("/update") 
     public Response update(MultivaluedMap<String, String> formParams){ 
    //business logic 
    //return appropriate Response object 
    } 

我總是formParams.size()爲零。爲什麼提交的表單參數在MultivaluedMap對象中不可用?

在服務器日誌以下警告消息:

警告:servlet請求的URI http://localhost:8080/myApp/resource/update包含形式參數在請求體但請求體已經由servlet或servlet過濾器訪問所述消耗請求參數。只有使用@FormParam的資源方法才能按預期工作。通過其他方式使用請求主體的資源方法將無法按預期工作。

(我測試前,禁止所有Servlet過濾器後,我沒有使用任何新澤西過濾器)

+0

你使用的是GlassFish 4的JAX-RS(無外部庫)的默認實現? –

+0

是的,我使用Glassfish捆綁的Jersey來運行該項目。 – siva636

+0

我得到同樣的問題..如何得到修復 – Vish

回答

2

你得到這個消息,如果表單數據請求主體已經通過調用HttpServletResponse.getParameter(PARAMNAME)消耗。如果有任何已註冊的servlet過濾器調用此方法,就會發生這種情況Jersey ContainerRequestFilter不能影響它。所以我建議調查你的部署配置(web.xml)。我已經測試了用Jersey 2.5-SNAPSHOT和Glassfish 4 night build(glassfish-4.0.1-b04-12_04_2013)注入Form實體,它的工作原理。

如果請求體已經被佔用,你仍然可以使用表單參數,但是你不能將它們注入爲一個實體(就像你的代碼一樣)。如果參數被消耗,則可以使用@FormParam JAX-RS註解注入參數:

@POST 
@Consumes("application/x-www-form-urlencoded") 
public String postForm(@FormParam("paramKey") String paramValue) { 
    return paramValue; 
}