title: retrieve JsonObject in POST with jersey
body: <p>I have some problems in my application, I send a POST request, but I cannot retrieve the JsonObject in my server, this is the code to send:</p>
  
  <pre><code>String quo = "{\"network\": {\"label\": \"new net 111\",\"cidr\": \"10.20.105.0/24\"}}";
  GsonBuilder builder = new GsonBuilder();
  Gson gson = builder.create();
  JsonParser json = new JsonParser();
  JsonObject jo = (JsonObject)json.parse(quo);
  ClientConfig config = new ClientConfig();
  
  Client client = ClientBuilder.newClient(config);
  
  WebTarget target = client.target("http://localhost:7999/jersey/rest/network/"+tenant_id);
  
  Response oj = target.request().accept(MediaType.APPLICATION_JSON)
          .header("X-Auth-Token", token)
          .post(Entity.json(gson.toJson(jo)));
  </code></pre>
  
  <p>Trying to retrieve with:</p>
  
  <pre><code>@POST
  @Produces(MediaType.APPLICATION_JSON)
  @Path("/{tenant_id}")
  public String createNetwork(@HeaderParam(value = "X-Auth-Token") String authToken, 
                          @PathParam(value = "tenant_id") String tenant_id, 
                          JsonObject network){
  
      Response response = client.target(NOVA_ENDPOINT+tenant_id)
                  .request(MediaType.APPLICATION_JSON)
                  .header("X-Auth-Token", authToken)
                  .post(Entity.json(gson.toJson(network)));
      System.out.println("Hello"); 
      String responseJson = response.readEntity(String.class);
  </code></pre>
  
  <p>JsonObject network seems to be empty, in fact it doesn't execute the method ("Hello is not printed"), the error I get is "Invalid request body" (because the JsonObject is empty I think)..
  What's wrong with my code?  </p>
  
  <p>Ok, I understood that the problem is related to Json handling such as I'm using Gson. This is my improved code (simplified version) following users suggestion, but I still have problems..</p>
  
  <p>Client Side:</p>
  
  <pre><code>package openstack;
  
  import javax.ws.rs.client.Client;
  import javax.ws.rs.client.ClientBuilder;
  import javax.ws.rs.client.Entity;
  import javax.ws.rs.client.WebTarget;
  import javax.ws.rs.core.Response;
  import org.glassfish.grizzly.http.server.HttpServer;
  import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
  import org.glassfish.jersey.server.ResourceConfig;
  import com.google.gson.Gson;
  import com.google.gson.GsonBuilder;
  import com.google.gson.JsonObject;
  import com.google.gson.JsonParser;
  import java.net.URI;
  
  
  public class Post {
  
      public static HttpServer startServer() {
      final ResourceConfig resourceConfig = new ResourceConfig()
              .packages("openstack")
              .register(GsonMessageBodyHandler.class);
      return GrizzlyHttpServerFactory.createHttpServer(URI.create("http://localhost:7999/jersey/rest"), resourceConfig);
  }  
      public static void main(String[] args) {
  
      String quo = "{\"keypair\": {\"name\": \"MyKey\"}}";
      HttpServer server = startServer();
  
  
      Client client = ClientBuilder.newClient();
  
      client.register(GsonMessageBodyHandler.class);
  
      GsonBuilder builder = new GsonBuilder();
      Gson gson = builder.create();
      JsonParser json = new JsonParser();
      JsonObject jo = (JsonObject)json.parse(quo);
  
      WebTarget target = client.target("http://localhost:7999/jersey/rest/test/prova");
  
      System.out.println(jo);
      Response oj = target.request().post(Entity.json(jo));
  
      String responseString = oj.readEntity(String.class);
      System.out.println(responseString);
  
      }
  }
  </code></pre>
  
  <p>Server Side:</p>
  
  <pre><code>package openstack;
  
  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.Client;
  import javax.ws.rs.client.ClientBuilder;
  import javax.ws.rs.core.MediaType;
  import javax.ws.rs.core.Response;
  
  import com.google.gson.Gson;
  import com.google.gson.GsonBuilder;
  import com.google.gson.JsonObject;
  import com.google.gson.JsonParser;
  
  @Path("/test")
  public class Test {
  
      GsonBuilder builder = new GsonBuilder();
      Gson gson = builder.create();
      Parliament parliament = new Parliament();
      JsonParser json = new JsonParser();
      private final Client client;
  
      public Test() {
          client = ClientBuilder.newClient().register(GsonMessageBodyHandler.class);
      }
  
      @POST
      @Consumes(MediaType.APPLICATION_JSON)
      @Produces(MediaType.APPLICATION_JSON)
      @Path("/prova")
      public Response mymethod(JsonObject keypairsob){
  
          return Response.ok(keypairsob).build();
  
      }
  }
  </code></pre>
  
  <p>I created a GsonMessageBodyHandler.java in my package with the code suggested below by the user peeskillet. Added jersey-container-grizzly2-http.jar to my web-inf/lib (I don't know how to proper use Maven), but still doesn't work.. what am I missing?  </p>