繁体   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