泽西使用MessageBodyWriter
s到处理的Java序列化对象的请求流(或响应流在服务器端,以及MessageBodyReader
s到处理去响应流的-serialization(或服务器端的请求流)为Java对象.你可以阅读更多的JAX -RS实体提供商.
话虽这么说,每当你看到类似"没有MessageBodyReader(Writer)找到某种类型的错误以及java类型的错误"时,就意味着没有序列化器来处理转换.在您的特定情况下,它表示没有编写器可以处理ArrayList
到multipart/form-data 的转换.这是有道理的,因为作者将如何知道如何进行这种转换.
对于multipart,您需要在客户端客户端实际使用多部分API.作者知道如何将这些API对象转换为所需的多部分.有关API的完整列表,您可以查看该包com.sun.jersey.multipart
.
以下是发送文件的示例
@POST @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.TEXT_PLAIN) public String getTest(@FormDataParam("file") InputStream in, @FormDataParam("file") FormDataContentDisposition fdc) { try (FileOutputStream out = new FileOutputStream(fdc.getFileName())) { ReaderWriter.writeTo(in, out); } catch (IOException ex) { ex.printStackTrace(System.out); return "Bad $#!t happended"; } return "Upload OK"; } @Test public void doit() { File file = new File("..."); FileDataBodyPart filePart = new FileDataBodyPart("file", file); MultiPart entity = new FormDataMultiPart() .bodyPart(filePart); Client client = Client.create(); WebResource resource = client.resource("http://localhost:9998/service"); ClientResponse response = resource .type(MediaType.MULTIPART_FORM_DATA_TYPE) .post(ClientResponse.class, entity); assertEquals(200, response.getStatus()); assertEquals("Upload OK", response.getEntity(String.class)); response.close(); }
对于Jersey multipart的1.x支持,实际上没有任何文档.但很多时候,测试中都会看到最好的文档.因此,如果您想要更多示例,请查看针对jersey-multipart的测试.
这是使用Jersey Test Framework的完整测试.像任何其他JUnit测试一样运行它.替换常量FILE_ONE
和FILE_TWO
系统上某些任意文件的位置.您应该看到保存到当前工作目录的文件(很可能是项目根目录)
import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.core.DefaultResourceConfig; import com.sun.jersey.core.header.ContentDisposition; import com.sun.jersey.core.util.ReaderWriter; import com.sun.jersey.multipart.FormDataBodyPart; import com.sun.jersey.multipart.FormDataMultiPart; import com.sun.jersey.multipart.FormDataParam; import com.sun.jersey.multipart.MultiPart; import com.sun.jersey.multipart.file.FileDataBodyPart; import com.sun.jersey.spi.container.servlet.WebComponent; import com.sun.jersey.test.framework.JerseyTest; import com.sun.jersey.test.framework.WebAppDescriptor; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import static org.junit.Assert.assertEquals; import org.junit.Test; /** * Run this like any other JUnit test. Dependencies for test are as follows. * *1.19 * ** *com.sun.jersey *jersey-servlet *${jersey.version} ** *com.sun.jersey *jersey-servlet *${jersey.version} ** *com.sun.jersey.jersey-test-framework *jersey-test-framework-grizzly2 *1.19 *test ** * */ public class MultipartTest extends JerseyTest { @Path("service") public static class Service { @POST @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.TEXT_PLAIN) public String getTest(@FormDataParam("file") Listcom.sun.jersey.contribs *jersey-multipart *${jersey.version} *files) { for (FormDataBodyPart filePart: files) { ContentDisposition cd = filePart.getContentDisposition(); try (FileOutputStream out = new FileOutputStream(cd.getFileName())) { ReaderWriter.writeTo(filePart.getEntityAs(InputStream.class), out); } catch (IOException ex) { ex.printStackTrace(System.out); return "Oops"; } } return "Upload OK"; } } public static class AppConfig extends DefaultResourceConfig { public AppConfig() { super(Service.class); } } @Override public WebAppDescriptor configure() { return new WebAppDescriptor.Builder() .initParam(WebComponent.RESOURCE_CONFIG_CLASS, AppConfig.class.getName()) .build(); } private static final String FILE_ONE = " "; private static final String FILE_TWO = " "; @Test public void doit() { File file1 = new File(FILE_ONE); File file2 = new File(FILE_TWO); MultiPart entity = new FormDataMultiPart(); FileDataBodyPart filePart = new FileDataBodyPart("file", file1); entity.bodyPart(filePart); filePart = new FileDataBodyPart("file", file2); entity.bodyPart(filePart); ClientResponse response = resource().path("service") .type(MediaType.MULTIPART_FORM_DATA_TYPE) .post(ClientResponse.class, entity); assertEquals(200, response.getStatus()); assertEquals("Upload OK", response.getEntity(String.class)); response.close(); } }
这是与Jersey 2.x相同的测试.只需替换常量FILE_ONE
和系统FILE_TWO
上的某些文件位置,然后运行测试.这些文件应保存到当前的工作目录中.
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.client.Entity; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.media.multipart.ContentDisposition; import org.glassfish.jersey.media.multipart.FormDataBodyPart; import org.glassfish.jersey.media.multipart.FormDataMultiPart; import org.glassfish.jersey.media.multipart.FormDataParam; import org.glassfish.jersey.media.multipart.MultiPart; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.media.multipart.file.FileDataBodyPart; import org.glassfish.jersey.message.internal.ReaderWriter; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; import org.junit.Test; import static junit.framework.Assert.assertEquals; /** * Run it like any other JUnit test. Required dependencies are as follows: * ** *org.glassfish.jersey.test-framework.providers *2.22.1 *test ** * */ public class Jersey2MultipartTest extends JerseyTest { @Path("service") public static class Service { @POST @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.TEXT_PLAIN) public String getTest(@FormDataParam("file") Listorg.glassfish.jersey.media *jersey-media-multipart *2.22.1 *test *files) { for (FormDataBodyPart filePart: files) { ContentDisposition cd = filePart.getContentDisposition(); try (FileOutputStream out = new FileOutputStream(cd.getFileName())) { ReaderWriter.writeTo(filePart.getEntityAs(InputStream.class), out); } catch (IOException ex) { ex.printStackTrace(System.out); return "Oops"; } } return "Upload OK"; } } @Override public ResourceConfig configure() { return new ResourceConfig(Service.class) .register(MultiPartFeature.class); } @Override public void configureClient(ClientConfig config) { config.register(MultiPartFeature.class); } private static final String FILE_ONE = " "; private static final String FILE_TWO = " "; @Test public void doit() { MultiPart entity = new FormDataMultiPart(); addFiles(entity, FILE_ONE, FILE_TWO); Response response = target("service").request() .post(Entity.entity(entity, MediaType.MULTIPART_FORM_DATA)); assertEquals(200, response.getStatus()); assertEquals("Upload OK", response.readEntity(String.class)); response.close(); } private void addFiles(MultiPart entity, String... files) { for (String file: files) { FileDataBodyPart filePart = new FileDataBodyPart("file", new File(file)); entity.bodyPart(filePart); } } }