2017-02-23 36 views
0

我有以下的REST API来解析给出JSON:发送文件(如file1.json)为POST REST API,输入流为空

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扩展邮递员测试, filedetail.getName()正在工作,但收到的输入流为空。这里我发送的post请求:

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 

收到的inputstream为空。

注:如果我设置为“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有什么问题吗?

回答

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注释(我相信它检测到它作为多/形式的例子-data),并从客户请求中删除内容类型,因为在这种情况下,它会导致错误400