将文件(例如file1.json)发送到POST REST API,输入流为空

时间:2017-02-23 17:04:10

标签: java rest intellij-idea jersey jax-rs

我有以下REST API来解析给定的JSON:

POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.TEXT_PLAIN)
@Path("/test")
public String getText(@FormDataParam("file") InputStream fileInputStream, @FormDataParam("file") FormDataContentDisposition fileDetail) throws Exception {

当我使用chrome extension postman测试它时,filedetail.getName()正在工作,但是接收的输入流为null。这里是我发送的帖子请求:

POST /parse/test HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache

----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="file"; filename="1.json"
Content-Type: 


----WebKitFormBoundaryE19zNvXGzXaLvS5C

收到的输入流为空。

注意:如果我将内容类型设置为“multipart / form-data”,我会遇到异常:

java.lang.NullPointerException
    com.sun.jersey.multipart.impl.MultiPartReaderClientSide.unquoteMediaTypeParameters(MultiPartReaderClientSide.java:245)
    com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readMultiPart(MultiPartReaderClientSide.java:172)
    com.sun.jersey.multipart.impl.MultiPartReaderServerSide.readMultiPart(MultiPartReaderServerSide.java:80)
    com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:158)
    com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:85)
    com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:490)
    com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:555)
    com.sun.jersey.multipart.impl.FormDataMultiPartDispatchProvider$FormDataInjectableValuesProvider.getInjectableValues(FormDataMultiPartDispatchProvider.java:122)
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153)
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:183)

所以我发送它没有任何标题,如何读取我从邮递员发送的文件,我的REST API有什么问题?

1 个答案:

答案 0 :(得分:0)

你使用org.glassfish.jersey.bundle(jaxrs-ri)吗?

如果这样做,则必须将MultiPartFeature.class添加到ApplicationConfigure.java(其中包含覆盖getClasses())

如果你使用灰熊,那么你必须在ResourceConfig中填写并注册该课程。

这里有两个例子

第一个灰熊

public static HttpServer startServer() {
    final ResourceConfig rc = new ResourceConfig().packages(true, "your.controllers.package");
    rc.register(MultiPartFeature.class);

    return GrizzlyHttpServerFactory.createHttpServer(URI.create("http://localhost:8080/"),rc);
}

现在的球衣

@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> resources = new HashSet<>();
    addResources(resources);
    return resources;
}

private void addResources(Set<Class<?>> resources) {
    resources.add(MultiPartFeature.class);
}

我还从我的方法中删除Consumes注释(我相信它默认将其检测为multipart / form-data)并从客户端请求中删除内容类型,因为在这种情况下,它会导致错误400