2014-11-23 9 views
6

voglio serizalize a JSON con org.glassfish.jersey implementazioneSerialize javax.ws.rs Entity a JSON

Map<String, String> entity = Maps.newHashMap(); 
entity.put("foo", "bar"); 

Response response = Response.status(Response.Status.OK) 
          .entity(entity) 
          .type(MediaType.APPLICATION_JSON).build(); 

System.out.println(response.getEntity()); 

Questa mappa serializzare per non standard { foo: "bar" }. Voglio testare questo comportamento in unit test.

risposta

4

Non è possibile eseguire il test in questo modo. Quello che state facendo qui

Response response = Response.status(Response.Status.OK) 
          .entity(entity) 
          .type(MediaType.APPLICATION_JSON).build(); 

è la costruzione di una uscita risposta . Nel framework JAX-RS, dopo aver inviato una risposta, ad es.

@GET 
@Produced(MediaType.APPLICATION_JSON) 
public Response getResponse() { 
    ... 
    return Response.status(Response.Status.OK) 
        .entity(entity) 
        .type(MediaType.APPLICATION_JSON).build(); 
} 

deve ancora attraverso un MessageBodyWriter per la serializzazione a JSON.

Detto questo, Jersey ha un Test Framework, che possiamo usare per testare i nostri metodi di risorse. Potete trovare tutti gli esempi ufficiali at the Github

Un campione (con alcune modifiche):

Questi sono il minimo richiesto dipendenze Maven

<dependencies> 
    <dependency> 
     <groupId>org.glassfish.jersey.test-framework</groupId> 
     <artifactId>jersey-test-framework-core</artifactId> 
     <version>2.13</version> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.test-framework.providers</groupId> 
     <artifactId>jersey-test-framework-provider-grizzly2</artifactId> 
     <version>2.13</version> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-json-jackson</artifactId> 
     <version>2.13</version> 
    </dependency> 
</dependencies> 

classe Test

public class TestJSONResource extends JerseyTest { 

    @Override 
    protected TestContainerFactory getTestContainerFactory() { 
     return new GrizzlyTestContainerFactory(); 
    } 

    @Path("test") 
    public static class TestResource { 
     @GET 
     @Produces(MediaType.APPLICATION_JSON) 
     public Response getJson() { 
      Map<String, String> entity = Maps.newHashMap(); 
      entity.put("foo", "bar"); 

      Response response = Response.status(Response.Status.OK) 
        .entity(entity) 
        .type(MediaType.APPLICATION_JSON).build(); 
      return response; 
     } 
    } 

    @Override 
    protected DeploymentContext configureDeployment() { 
     return DeploymentContext.builder(new ResourceConfig(TestResource.class)) 
       .contextPath("context1/context2") 
       .build(); 
    } 

    @Test 
    public void testGet() { 
     final WebTarget target = target("test"); 
     final String s = target.request().get(String.class); 
     System.out.println(s); 
    } 
} 

jersey-media-json-jackson fornisce MessageBodyWriter e MessageBodyReader per r elaborazione JSON, che è implicitamente registrata per noi.

+0

Grazie, erogatori grizzly2 ritorno standard di '{ "pippo": "bar"}' invece del mio '{foo: "bar"}' – MariuszS

+0

Ok, con 2,6 questo rapporto InternalServerErrorException ... – MariuszS

+0

Jersey 2.6 Il mio esempio di codice ha vinto anche compilare. Se desideri ulteriore aiuto, devi includere più informazioni nel tuo post per consentirci di aiutarti, ad esempio un esempio completo (con dipendenze) che produce il problema. Errore del server 'InternalServerErrorException' potrebbe significare qualcosa –