java - 媒体类型 "multipart/form-data"没有可用的 MessageBodyWriter

标签 java tomcat multipartform-data jersey-client multipartentity

我正在尝试创建一个 jersey 客户端来通过多部分请求访问服务器。
我有要上传为 java.io.ByteArrayOutputStream 类型流的文件。
我搜索错误并找到this question here还有这个answer here
并添加 在创建 Clientregister(MultiPartFeature.class),但没有任何效果。
我可能只需要在正确的方向上轻推一下。谢谢!

我没有使用 Maven 或任何东西。

我的 java 文件的相关部分是:

FormDataMultiPart multiPart = new FormDataMultiPart();
FormDataContentDisposition.FormDataContentDispositionBuilder dispositionBuilder = FormDataContentDisposition
 .name("file");

dispositionBuilder.fileName("file.zip");
FormDataContentDisposition formDataContentDisposition = dispositionBuilder.build();

/*
 * byteArrayOutputStream is of type java.io.ByteArrayOutputStream
 * and contains the file I wish to upload.
 */
multiPart.bodyPart(
 new FormDataBodyPart("file", byteArrayOutputStream, MediaType.APPLICATION_OCTET_STREAM_TYPE)
 .contentDisposition(formDataContentDisposition));

Entity < FormDataMultiPart > entity = Entity.entity(multiPart, MediaType.MULTIPART_FORM_DATA_TYPE);

Client client = ClientBuilder.newClient(new ClientConfig().register(MultiPartFeature.class));
WebTarget webTarget = client.target("http://localhost:3000/path/to/service");

// send request

Invocation.Builder invocationBuilder = webTarget.request();
Response response = invocationBuilder.post(entity);
return response;

web.xml 的相关部分是:

          <servlet>
              <servlet-name>Jersey Web Application</servlet-name>
              <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
              <init-param>
                     <param-name>jersey.config.server.provider.packages</param-name>
                     <param-value>com.example</param-value>
              </init-param>
              <init-param>
                     <param-name>jersey.config.server.provider.classnames</param-name>
                     <param-value>org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
              </init-param>
              <load-on-startup>1</load-on-startup>
       </servlet>

尝试在 Apache Tomcat 8.5 运行时服务器上的 Eclipse 中运行它时出现以下错误。

SEVERE: Servlet.service() for servlet [Jersey Web Application] in context with path [/TestRest] threw exception [javax.ws.rs.ProcessingException: No available MessageBodyWriter for class "class java.io.ByteArrayOutputStream" and media type "multipart/form-data".] with root cause
java.lang.IllegalArgumentException: No available MessageBodyWriter for class "class java.io.ByteArrayOutputStream" and media type "multipart/form-data".
    at org.glassfish.jersey.media.multipart.internal.MultiPartWriter.writeTo(MultiPartWriter.java:229)
    at org.glassfish.jersey.media.multipart.internal.MultiPartWriter.writeTo(MultiPartWriter.java:79)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130)

最佳答案

没有处理OutputStreamMessageBodyWriter。使用 InputStream 代替

关于java - 媒体类型 "multipart/form-data"没有可用的 MessageBodyWriter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42794502/

相关文章:

java - 写入并保存文件并打开它

tomcat - 如何设置 TeamCity 以通过 https 进行公共(public)访问?

tomcat - Gradle Tomcat 插件设置 JVM 参数

java - 有没有从 HttpServletRequest 读取表单数据的方法?

从 iOS App (Swift) 请求时 PHP 没有响应

java - Apache Camel : place message back in original location after being processed

java - 使 spring 安全 session 无效

java - 线程行为不正确

http - 获取 505 HTTP 版本在 HTTPS 上不受支持,但在 HTTP 上不受支持

javascript - Node.js 文件上传(Express 4、MongoDB、GridFS、GridFS-Stream)