我有以下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有什么问题?
答案 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