繁体   English   中英

带有FormDataContentDisposition的org.glassfish.jersey上传文件

[英]org.glassfish.jersey upload file with FormDataContentDisposition

http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/我正在遵循本指南并遇到问题。 我有一些疑问。

  1. 是否所有依赖项都必须对应? 我的项目有一些org.glassfish.jersey依赖项,本指南建议使用org.sun.jersey。 我是否也必须使用相同的版本进行更改?

     <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>2.16</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>2.16</version> 

  2. 我有这个错误

     org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization. [[FATAL] No injection source found for a parameter of type public ***.***.****.common.dto.response.AbstractResponse ***.***.****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService.upload(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class ***.***.****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@90516e]}, definitionMethod=public ***.***.***.common.dto.response.AbstractResponse ***.***.*****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService.upload(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=file1, defaultValue=null], Parameter [type=class org.glassfish.jersey.media.multipart.FormDataContentDisposition, source=file1, defaultValue=null]], responseType=class ***.***.***.common.dto.response.AbstractResponse}, nameBindings=[]}'] 

    这是我的网络服务

     @POST @Path("/upload") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) public AbstractResponse upload(@FormDataParam("file1") InputStream file1, @FormDataParam("file1") FormDataContentDisposition filename1 ) { 

    这是我的电话:

     $.ajax({ url: 'http://localhost:8080/******/webapi/m2m/upload', data: fd, processData: false, contentType: 'multipart/form-data', type: 'POST', success: function(data){ alert(JSON.stringify(data)); return; } }); 

如果Web服务只有1个参数(FormData InputStream),则可以访问该Web服务。 如何解决?

  1. 我还想为Web服务添加另一个String参数。 我该怎么办?

谢谢peeskillet的答案。 多一点。

SEVERE: The web application [/linterm2m] created a ThreadLocal with key of type [org.jvnet.hk2.internal.PerLocatorUtilities$1] (value [org.jvnet.hk2.internal.PerLocatorUtilities$1@df94b1]) and a value of type [java.util.WeakHashMap] (value [{}]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.

如果你的项目是使用org.glassfish ,您使用的泽西2 com.sun是泽西1,你不应该将两者搅和。 话虽如此,您面临的错误很可能是由于您没有注册MultipartFeature 在启动时对资源模型(资源方法)进行“正确性”验证时,如果未注册功能,则该功能特有的注释是未知的,就像没有注释一样。 而且,您不能有多个不带注释的方法参数。

如果您使用的是ResourceConfig ,则可以简单地使用

public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        register(MultiPartFeature.class);
    }
}

如果使用的是web.xml,则可以为注册的Jersey servlet设置<init-param>

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
</init-param>

“我还想为Web服务添加另一个String参数。我该怎么办?”

您需要将其作为多部分请求的一部分,而客户端也需要确保将其作为多部分的一部分发送。 在服务器端,只需添加另一个@FormDataParam("anotherString") String anotherString作为方法参数。 至于客户端,我不知道jQuery可以帮上忙。 还没有测试过,但是您可以尝试一下 ,它显示数据被追加到FormParam 这是Angular的功能 ,我自己在其中构建了请求主体。 可能有点多,因为您可能不需要显式设置内容类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM