récupérer JsonObject POST avec jersey

J'ai quelques problèmes dans ma demande, j'envoie une requête POST, mais je ne peut pas récupérer la JsonObject dans mon serveur, voici le code à envoyer:

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

Essayer de le récupérer avec:

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

JsonObject réseau semble être vide, en fait il n'a pas d'exécuter la méthode ("Bonjour n'est pas imprimé"), le message d'erreur que j'obtiens est "Invalide du corps de la requête" (parce que le JsonObject est vide je pense)..
Quel est le problème avec mon code?

Ok, j'ai compris que le problème est lié à Json de manutention tels que je suis en utilisant Gson. C'est mon code améliorée (version simplifiée) à la suite d'utilisateurs suggestion, mais j'ai toujours des problèmes..

Côté Client:

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

Côté Serveur:

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

J'ai créé un GsonMessageBodyHandler.java dans mon colis avec le code proposé ci-dessous par l'utilisateur peeskillet. Ajouté jersey-container-grizzly2-http.jar pour ma web-inf/lib (je ne sais pas comment faire pour la bonne utilisation de Maven), mais ne fonctionne toujours pas.. ce qui me manque?

c'est parce que je suis en train d'écrire un proxy qui agissent comme un serveur pour les requêtes entrantes et en tant que client pour Openstack. Ce n'est pas la même ressource, et le problème se produit avant, parce que la méthode createNetwork n'est pas exécutée du tout.
Avez-vous d'ajouter le JSON-P module?
En fait, je n'ai pas parce que je suis en utilisant Gson.. est-il un problème?
Oui. Lorsque vous envoyez la demande, il est sérialisé JSON forme. Mais qui va désérialiser retour à JsonObject? Ce qui est fait dans les coulisses par un MessageBodyReader de mise en œuvre qui prend en charge JSON-P. le lecteur est fourni dans le JSON-P module. Je ne suis Pas familier avec Gson, donc je ne sais pas si c' JsonObject est un Gson objet ou un JSON-P de l'objet. Si c'est Gson objet, vous pouvez prendre un coup d'oeil à MessageBodyReader/Writer implemntation pour Gson. Vous devez enregistrer ce fournisseur à la fois avec le client et le serveur. Si c'est du JSON-P, le JSON-P module s'inscrire lui-même
Désolé, j'ai oublié le lien pour la mise en œuvre. c'est Ici

OriginalL'auteur rok | 2014-11-28