単純な複数フォームの投稿用にプロバイダーを構成する方法。任意の提案/指針をいただければ幸いです。
スタックトレース:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=multipart/form-data, type=class org.glassfish.jersey.media.multipart.FormDataMultiPart, genericType=class org.glassfish.jersey.media.multipart.FormDataMultiPart.
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:227)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:149)
at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1139)
at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:433)
at org.glassfish.jersey.test.inmemory.internal.InMemoryConnector.apply(InMemoryConnector.java:214)
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:217)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:655)
pom.xml の依存関係:
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-inmemory</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
</dependency>
</dependencies>
コード:
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
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.client.WebTarget;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;
public class TestMultiPartTest extends JerseyTest {
@Override
protected Application configure() {
ResourceConfig rc = new ResourceConfig(ServerSideResource.class);
rc.register(MultiPartFeature.class);
return rc;
}
@Path("test")
public static class ServerSideResource {
@POST
@Path("/multipart")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public Response file(FormDataMultiPart formParams) {
System.out.println("found multipart resource");
return Response.ok().build();
}
@POST
@Path("/encoded")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
public Response file(Form formParams) {
System.out.println("found encoded resource");
return Response.ok().build();
}
}
@Test
public void testPostMultiPartFile() {
final WebTarget target = target().path("test/multipart");
final FormDataMultiPart mp = new FormDataMultiPart();
final FormDataBodyPart p = new FormDataBodyPart("field1", "CONTENT ONE");
mp.bodyPart(p);
final FormDataBodyPart p2 = new FormDataBodyPart("field2", "CONTENT TWO");
mp.bodyPart(p2);
System.out.println("making multipart request");
final Response r = target.request().post(Entity.entity(mp, MediaType.MULTIPART_FORM_DATA_TYPE), Response.class);
System.out.println(r.getStatus());
assertThat("response is 200", r.getStatus(), is(200));
}
@Test
public void testPostEncodedForm() {
final WebTarget target = target().path("test/encoded");
final Form form = new Form();
form.param("test", "value");
System.out.println("making encoded request");
final Response r = target.request().post(Entity.form(form), Response.class);
System.out.println(r.getStatus());
assertThat("response is 200", r.getStatus(), is(200));
}
}