Java 没有适用于媒体类型的MessageBodyWriter“;“多部分/表单数据”;

Java 没有适用于媒体类型的MessageBodyWriter“;“多部分/表单数据”;,java,tomcat,multipartform-data,jersey-client,multipartentity,Java,Tomcat,Multipartform Data,Jersey Client,Multipartentity,我正在尝试创建一个jersey客户端,以通过多部分请求命中服务器。 我将文件作为java.io.ByteArrayOutputStream类型流上传。 我搜索了错误,发现了这个并添加了 在创建客户端时注册(MultiPartFeature.class),但无效。 我可能只需要朝正确的方向轻推一下。谢谢 我没有使用Maven或任何东西。 我的java文件中的相关部分是: FormDataMultiPart multiPart = new FormDataMultiPart(); FormData

我正在尝试创建一个jersey客户端,以通过多部分请求命中服务器。
我将文件作为
java.io.ByteArrayOutputStream
类型流上传。
我搜索了错误,发现了这个
并添加了
在创建
客户端时注册(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;
我在ApacheTomcat8.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)

没有处理输出流的
MessageBodyWriter
。使用
输入流
代替

好的,注册MultiPartFeature.class

Client Client=ClientBuilder.newClient(newclientconfig().register(MultiPartFeature.class))

但您必须处理和注册响应类型,假设您上载了一个文件,并且响应的媒体类型是json,那么您必须添加这样的寄存器

Client Client=ClientBuilder.newClient(newclientconfig().register(MultiPartFeature.class).register(JacksonFeature.class))


我认为您需要使用输入流(或字节[]),而不是输出流。不过,您也可以使用InputStream,这样就不会耗尽资源memory@peeskillet将代码转换为利用InputStream(ByteArrayInputStream)对我来说很有用!你能加上它作为答案吗?干杯
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)