org.glassfish.jersey 使用 FormDataContentDisposition 上传文件
org.glassfish.jersey upload file with FormDataContentDisposition
http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/
我正在按照本指南进行操作,但 运行 遇到了一个问题。我有一些问题。
是不是所有的依赖都要对应?我的项目有一些 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>
我有这个错误
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 服务。如何解决?
- 我还想为网络服务添加另一个字符串参数。我该怎么办?
谢谢 peeskillet 的回答。有点多余。
SEVERE: The web application [/linterm2m] created a ThreadLocal with key of type [org.jvnet.hk2.internal.PerLocatorUtilities] (value [org.jvnet.hk2.internal.PerLocatorUtilities@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
,那么您使用的是 Jersey 2。com.sun
是 Jersey 1,切勿将两者混用。也就是说,您面临的错误很可能是由于您没有注册 MultipartFeature
。当启动时为 "correctness" 验证资源模型(资源方法)时,如果未注册该功能,则该功能特定的注释是未知的,就像没有注释一样。而且你不能有超过一个没有注释的方法参数。
如果您使用的是 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>
"I also want to add another String parameter for the web service. What should I do?"
您需要将其作为多部分请求的一部分进行发送,并且客户端也需要确保将其作为多部分请求的一部分发送。在服务器端只需添加另一个 @FormDataParam("anotherString") String anotherString
作为方法参数。至于客户,我不知道 jQuery 会对此提供帮助。还没有测试过,但你可以尝试 this, which shows data being appended to FormParam
. Here's ,我自己在其中构建了请求主体。可能有点多,因为您可能不需要明确设置内容类型。
http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/ 我正在按照本指南进行操作,但 运行 遇到了一个问题。我有一些问题。
是不是所有的依赖都要对应?我的项目有一些 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>
我有这个错误
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 服务。如何解决?
- 我还想为网络服务添加另一个字符串参数。我该怎么办?
谢谢 peeskillet 的回答。有点多余。
SEVERE: The web application [/linterm2m] created a ThreadLocal with key of type [org.jvnet.hk2.internal.PerLocatorUtilities] (value [org.jvnet.hk2.internal.PerLocatorUtilities@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
,那么您使用的是 Jersey 2。com.sun
是 Jersey 1,切勿将两者混用。也就是说,您面临的错误很可能是由于您没有注册 MultipartFeature
。当启动时为 "correctness" 验证资源模型(资源方法)时,如果未注册该功能,则该功能特定的注释是未知的,就像没有注释一样。而且你不能有超过一个没有注释的方法参数。
如果您使用的是 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>
"I also want to add another String parameter for the web service. What should I do?"
您需要将其作为多部分请求的一部分进行发送,并且客户端也需要确保将其作为多部分请求的一部分发送。在服务器端只需添加另一个 @FormDataParam("anotherString") String anotherString
作为方法参数。至于客户,我不知道 jQuery 会对此提供帮助。还没有测试过,但你可以尝试 this, which shows data being appended to FormParam
. Here's