2013-10-29 9 views
13

सरल बहु-फ़ॉर्म पोस्ट के लिए प्रदाता को कॉन्फ़िगर कैसे करें। किसी भी सुझाव/पॉइंटर्स की सराहना की जाएगी।संदेश प्रकार के लिए नहीं मिला MessageBodyWriter मीडिया प्रकार = multipart/form-data त्रुटि

स्टैकट्रेस: ​​

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)); 
    } 

} 

उत्तर

31

खैर, जर्सी एकीकरण परीक्षणों स्रोत पढ़ने प्रलेखन सहायक नहीं था लेकिन पढ़ने कोड था

जर्सीटेस्ट उदाहरण में आपको कॉन्फ़िगर क्लाइंट विधि को ओवरराइड करने और मल्टीपार्टफ़ेचर क्लास में पास करने की आवश्यकता है।

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

कार्य कोड:

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)); 
    } 

} 
+2

धन्यवाद साथी। मेरे लिए यह ओवरराइड विधि थी: @ ओवरराइड संरक्षित शून्य कॉन्फ़िगर क्लाइंट (क्लाइंट कॉन्फिग कॉन्फ़िगर) { config.register (MultiPartFeature.class); } – vantesllar

3

आप के बजाय ग्राहक के पक्ष पर काम कर रहे के रूप में मैं था, और जर्सी 1.x, angstadt530 इस पृष्ठ पर से जवाब का उपयोग कर क्या है आप जरुरत।

Jersey client exception: A message body writer was not found

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

यह कैसे मेरे कोड में दिखता है, लेकिन उस पृष्ठ पर उदाहरण के रूप में अच्छी तरह से उत्कृष्ट है।

संबंधित मुद्दे