泽西岛:找不到媒体类型的 MessageBodyReader=multipart/form-data
Jersey: MessageBodyReader not found for media type=multipart/form-data
我已经在 SO 上发现了一些类似的问题,但其中 none 似乎解决了我的特定问题,我一直无法自己找到解决方案。
这是我遇到的错误:
Caused by: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=multipart/form-data; boundary=----WebKitFormBoundaryHWk1XUaeu7pEiDth, type=class org.glassfish.jersey.media.multipart.FormDataMultiPart, genericType=class org.glassfish.jersey.media.multipart.FormDataMultiPart.
我通过 jQuery AJAX 请求发送这个,如下所示:
$('#upload-image-form').on('submit', function(e) {
e.preventDefault();
var data = new FormData(this);
$.ajax({
url: url,
method: 'POST',
contentType: false,
processData: false,
data: data,
}).done(function(data) {
console.log(data);
}).fail(function(res, status) {
onError(res, status, 'Image upload failed');
});
});
这是我的 Java 端点:
@POST
@Path("/{userId}")
@Consumes("multipart/form-data")
public Response createGraphic(
@PathParam("userId") int userId,
FormDataMultiPart multiPartFormData) { ... }
我看到一些人幸运地将端点方法的参数更改为使用@FormDataParam 而不是 FormDataMultiPart(如 here 所示),但我无法编辑 Java class,所以我必须像上面那样使用它。
我的 pom.xml 具有以下依赖项:
<dependency>
<groupId>org.jvnet</groupId>
<artifactId>mimepull</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.12</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.12</version>
</dependency>
web.xml
<servlet>
<servlet-name>Jersey</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>my.package</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
我唯一能够挖掘的另一件事是使用 ResourceConfig 注册 MultiPartFeature;但是,我正在使用的项目没有任何应用程序 classes 或任何扩展 ResourceConfig 的 class(它是部署到 Tomcat 的 WAR,因此没有主要class).
还有其他配置需要做吗?我很困惑为什么这不起作用。
MultiPartFeature
有所需的 reader 和作家。但是您仍然需要注册该功能。正如您所提到的,您经常会在 Application/ResourceConfig
subclass 中看到它的注册。但在 web.xml 中,您只需将其添加到 class 列表中即可添加为提供者。您可以通过向 servlet 配置添加 <init-param>
来做到这一点,即
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>
org.glassfish.jersey.media.multipart.MultiPartFeature,
some.other.Provider
</param-value>
</init-param>
如您在示例中所见,如果您需要注册任何其他 providers/features,您可以用逗号分隔 class 个名称。
我已经在 SO 上发现了一些类似的问题,但其中 none 似乎解决了我的特定问题,我一直无法自己找到解决方案。
这是我遇到的错误:
Caused by: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=multipart/form-data; boundary=----WebKitFormBoundaryHWk1XUaeu7pEiDth, type=class org.glassfish.jersey.media.multipart.FormDataMultiPart, genericType=class org.glassfish.jersey.media.multipart.FormDataMultiPart.
我通过 jQuery AJAX 请求发送这个,如下所示:
$('#upload-image-form').on('submit', function(e) {
e.preventDefault();
var data = new FormData(this);
$.ajax({
url: url,
method: 'POST',
contentType: false,
processData: false,
data: data,
}).done(function(data) {
console.log(data);
}).fail(function(res, status) {
onError(res, status, 'Image upload failed');
});
});
这是我的 Java 端点:
@POST
@Path("/{userId}")
@Consumes("multipart/form-data")
public Response createGraphic(
@PathParam("userId") int userId,
FormDataMultiPart multiPartFormData) { ... }
我看到一些人幸运地将端点方法的参数更改为使用@FormDataParam 而不是 FormDataMultiPart(如 here 所示),但我无法编辑 Java class,所以我必须像上面那样使用它。
我的 pom.xml 具有以下依赖项:
<dependency>
<groupId>org.jvnet</groupId>
<artifactId>mimepull</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.12</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.12</version>
</dependency>
web.xml
<servlet>
<servlet-name>Jersey</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>my.package</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
我唯一能够挖掘的另一件事是使用 ResourceConfig 注册 MultiPartFeature;但是,我正在使用的项目没有任何应用程序 classes 或任何扩展 ResourceConfig 的 class(它是部署到 Tomcat 的 WAR,因此没有主要class).
还有其他配置需要做吗?我很困惑为什么这不起作用。
MultiPartFeature
有所需的 reader 和作家。但是您仍然需要注册该功能。正如您所提到的,您经常会在 Application/ResourceConfig
subclass 中看到它的注册。但在 web.xml 中,您只需将其添加到 class 列表中即可添加为提供者。您可以通过向 servlet 配置添加 <init-param>
来做到这一点,即
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>
org.glassfish.jersey.media.multipart.MultiPartFeature,
some.other.Provider
</param-value>
</init-param>
如您在示例中所见,如果您需要注册任何其他 providers/features,您可以用逗号分隔 class 个名称。