簡體   English   中英

Amdatu多部分表單@FormParam始終為null

[英]Amdatu multi-part-form @FormParam is always null

因此,我在Felix框架內使用Amdatu創建了啟用OSGi的JSON Rest Service。

當我使用@GET時,我得到的ID值符合預期

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("file")
public String getFile(@QueryParam("id") String id) {
    System.out.println("id : "+id);
    return null;
}

當我使用@POST FormParam時始終為null

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("file")
public String getFile(@FormParam("id") String id) {
       System.out.println("id : "+id);
       return null;
}

當我使用@POST但使用應用程序JSON時,我總是獲取整個原始json,而不是值。

我觀看了此視頻: http : //www.amdatu.org/howto/createwebapp.html

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("file")
public String getFile(String id) throws Exception { 
    return id
}

我正在使用適用於chrome的高級Rest Client插件來測試服務。

使用庫

org.amdatu.web.rest.jaxrs:1.0.4
org.amdatu.web.rest.wink:1.0.8
jackson-jaxrs:1.9.13
jackson-mapper-asl:1.9.13
jackson-core-asl:1.9.13

更新:

通過將它們更改為“編譯” MediaType,我可以將Maven捆綁包中的褻瀆設置為“提供”。APPLICATION_FORM_URLENCODED現在可以使用。

但是MediaType.MULTIPART_FORM_DATA仍然沒有。

在表單發布期間,我的標題是:

Content-Type: multipart/form-data

如果我刪除@FormParam,則ID填充為:

id : --ARCFormBoundary5xbnwa6as8aor
Content-Disposition: form-data; name="id"

9
--ARCFormBoundary5xbnwa6as8aor--

當我添加@FormParam時,該值為null。

JAX-RS規范沒有說明應如何處理multipart / form-data。 不同的JAX-RS實現具有自己的專有方法來處理此問題。 據我所知,Apache Wink(我們在其之上構建)不支持@FormParam的多部分功能。 Wink中似乎確實有一些支持類型: http ://wink.apache.org/documentation/1.1.1/html/7.8%20MultiPart.html,但是Amdatu Wink捆綁包並未公開這些類,而且我也從未嘗試過使用它

下面的示例是我自己使用的解決方法。 當使用multipart和其他表單字段一起上傳文件時,這很有用(這就是為什么多數使用multipart的原因)。 我使用Apache File Upload解析請求,並可以訪問上載的文件和表單字段。

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void test(@Context HttpServletRequest request) {
    ServletFileUpload uploader = new ServletFileUpload(new DiskFileItemFactory());
    try {
        List<FileItem> parseRequest = uploader.parseRequest(request);
        for (FileItem fileItem : parseRequest) {
            if (fileItem.isFormField()) {
                System.out.println(fileItem.getFieldName() + ": "
                        + fileItem.getString());
            }

        }
    } catch (FileUploadException e) {
        e.printStackTrace();
    }
}

看來您在@Consumes中使用了錯誤的Mediatype。

我創建了一個示例(參見下文),該示例通過完全省略@Consumes或將其設置為MediaType.APPLICATION_FORM_URLENCODED來接受來自表單的參數。

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void test(@FormParam("id") String id) {
    System.out.println(id);
}

HTML

<form action="/agenda" method="post">
<input type="id" name="id"/>
<input type="submit" value="Test">
</form>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM