How to resolve MessageBodyWriter not found for media type=multipart/form-data error

≡放荡痞女 提交于 2019-11-28 01:48:26

Well, reading the documentation was not helpful but reading the jersey integration tests source code was.

In the JerseyTest instance you need to override the configureClient method and pass in the MultiPartFeature class.

@Override
protected void configureClient(ClientConfig config) {
    config.register(MultiPartFeature.class);
}

Working Code:

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;

import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
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.client.ClientConfig;
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;
    }

    @Override
    protected void configureClient(ClientConfig config) {
        config.register(MultiPartFeature.class);
    }

    @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(@FormParam("field3") String field3) {
            System.out.println("found encoded resource");
            System.out.println("got form.field3 value: " + field3);
            return Response.ok().build();
        }

    }

    @Test
    public void testAnotherWay() {
        WebTarget target = target("test/encoded");
        final Form form = new Form();
        form.param("field3", "field3 value");
        System.out.println("testAnotherWay");
        Response response = target.request().post(Entity.form(form), Response.class);
        System.out.println(response);
    }

    @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("field1: " + mp.getField("field1").getValue());
        System.out.println("field2: " + mp.getField("field2").getValue());
        System.out.println("making multipart request");
        final Response r = target.request().post(Entity.entity(mp, MediaType.MULTIPART_FORM_DATA), Response.class);
        System.out.println(r);
        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("field3", "field3 value");
        System.out.println("making encoded request");

        final Response r = target.request().post(Entity.form(form), Response.class);
        System.out.println(r);
        assertThat("response is 200", r.getStatus(), is(200));
    }

}
Karl Henselin

If you are working on the client side instead, as I was, and using Jersey 1.X, the answer by angstadt530 on this page is what you need.

Jersey client exception: A message body writer was not found

DefaultClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getClasses().add(MultiPartWriter.class);
Client client = Client.create(clientConfig);

is how it looks in my code, but the example on that page is excellent as well.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!